diff --git a/dna.sln b/dna.sln new file mode 100644 index 0000000..f2f0872 --- /dev/null +++ b/dna.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dna", "dna\dna.vcproj", "{888AAA01-F58E-4E41-8BBB-78294D9DABF7}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libIGraph", "libIGraph\libIGraph.vcproj", "{E8C90D0B-0F97-485C-8765-FC14202EF252}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {888AAA01-F58E-4E41-8BBB-78294D9DABF7}.Debug|Win32.ActiveCfg = Debug|Win32 + {888AAA01-F58E-4E41-8BBB-78294D9DABF7}.Debug|Win32.Build.0 = Debug|Win32 + {888AAA01-F58E-4E41-8BBB-78294D9DABF7}.Release|Win32.ActiveCfg = Release|Win32 + {888AAA01-F58E-4E41-8BBB-78294D9DABF7}.Release|Win32.Build.0 = Release|Win32 + {E8C90D0B-0F97-485C-8765-FC14202EF252}.Debug|Win32.ActiveCfg = Debug|Win32 + {E8C90D0B-0F97-485C-8765-FC14202EF252}.Debug|Win32.Build.0 = Debug|Win32 + {E8C90D0B-0F97-485C-8765-FC14202EF252}.Release|Win32.ActiveCfg = Release|Win32 + {E8C90D0B-0F97-485C-8765-FC14202EF252}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/dna/Bugs.txt b/dna/Bugs.txt new file mode 100644 index 0000000..7cf360e --- /dev/null +++ b/dna/Bugs.txt @@ -0,0 +1,17 @@ +Known Bugs that haven't yet been fixed +-------------------------------------- + +There is a memory leak somewhere. Haven't looked into it much yet. + +There is a problem with calling a generic method within a generic interface, when the +call-point is within a generic method itself. +This bug may have large implications for how the generic system works, so may be quite +a lot of work to fix. +This bug means that the LINQ .ThenBy() operator cannot work. + +If a field in a nested class references the containing class then the memory/stack size of the type +is not yet known, so function calls on the type fail, because the parameters size has been +calculated incorrectly. + +Finalization currently happens in any thread, when objects are allocated. +Should probably change this to have a proper finalizer thread, like in the real .NET diff --git a/dna/CIL_OpCodes.h b/dna/CIL_OpCodes.h new file mode 100644 index 0000000..2389130 --- /dev/null +++ b/dna/CIL_OpCodes.h @@ -0,0 +1,227 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#define CIL_NOP 0x00 + +#define CIL_LDARG_0 0x02 +#define CIL_LDARG_1 0x03 +#define CIL_LDARG_2 0x04 +#define CIL_LDARG_3 0x05 +#define CIL_LDLOC_0 0x06 +#define CIL_LDLOC_1 0x07 +#define CIL_LDLOC_2 0x08 +#define CIL_LDLOC_3 0x09 +#define CIL_STLOC_0 0x0a +#define CIL_STLOC_1 0x0b +#define CIL_STLOC_2 0x0c +#define CIL_STLOC_3 0x0d +#define CIL_LDARG_S 0x0e +#define CIL_LDARGA_S 0x0f +#define CIL_STARG_S 0x10 +#define CIL_LDLOC_S 0x11 +#define CIL_LDLOCA_S 0x12 +#define CIL_STLOC_S 0x13 +#define CIL_LDNULL 0x14 +#define CIL_LDC_I4_M1 0x15 +#define CIL_LDC_I4_0 0x16 +#define CIL_LDC_I4_1 0x17 +#define CIL_LDC_I4_2 0x18 +#define CIL_LDC_I4_3 0x19 +#define CIL_LDC_I4_4 0x1a +#define CIL_LDC_I4_5 0x1b +#define CIL_LDC_I4_6 0x1c +#define CIL_LDC_I4_7 0x1d +#define CIL_LDC_I4_8 0x1e +#define CIL_LDC_I4_S 0x1f +#define CIL_LDC_I4 0x20 +#define CIL_LDC_I8 0x21 +#define CIL_LDC_R4 0x22 +#define CIL_LDC_R8 0x23 + +#define CIL_DUP 0x25 +#define CIL_POP 0x26 + +#define CIL_CALL 0x28 + +#define CIL_RET 0x2a +#define CIL_BR_S 0x2b +#define CIL_BRFALSE_S 0x2c +#define CIL_BRTRUE_S 0x2d +#define CIL_BEQ_S 0x2e +#define CIL_BGE_S 0x2f +#define CIL_BGT_S 0x30 +#define CIL_BLE_S 0x31 +#define CIL_BLT_S 0x32 +#define CIL_BNE_UN_S 0x33 +#define CIL_BGE_UN_S 0x34 +#define CIL_BGT_UN_S 0x35 +#define CIL_BLE_UN_S 0x36 +#define CIL_BLT_UN_S 0x37 +#define CIL_BR 0x38 +#define CIL_BRFALSE 0x39 +#define CIL_BRTRUE 0x3a +#define CIL_BEQ 0x3b +#define CIL_BGE 0x3c +#define CIL_BGT 0x3d +#define CIL_BLE 0x3e +#define CIL_BLT 0x3f +#define CIL_BNE_UN 0x40 +#define CIL_BGE_UN 0x41 +#define CIL_BGT_UN 0x42 +#define CIL_BLE_UN 0x43 +#define CIL_BLT_UN 0x44 +#define CIL_SWITCH 0x45 +#define CIL_LDIND_I1 0x46 +#define CIL_LDIND_U1 0x47 +#define CIL_LDIND_I2 0x48 +#define CIL_LDIND_U2 0x49 +#define CIL_LDIND_I4 0x4a +#define CIL_LDIND_U4 0x4b +#define CIL_LDIND_I8 0x4c +#define CIL_LDIND_I 0x4d +#define CIL_LDIND_R4 0x4e +#define CIL_LDIND_R8 0x4f +#define CIL_LDIND_REF 0x50 +#define CIL_STIND_REF 0x51 +#define CIL_STIND_I1 0x52 +#define CIL_STIND_I2 0x53 +#define CIL_STIND_I4 0x54 + +#define CIL_ADD 0x58 +#define CIL_SUB 0x59 +#define CIL_MUL 0x5a +#define CIL_DIV 0x5b +#define CIL_DIV_UN 0x5c +#define CIL_REM 0x5d +#define CIL_REM_UN 0x5e +#define CIL_AND 0x5f +#define CIL_OR 0x60 +#define CIL_XOR 0x61 +#define CIL_SHL 0x62 +#define CIL_SHR 0x63 +#define CIL_SHR_UN 0x64 +#define CIL_NEG 0x65 +#define CIL_NOT 0x66 +#define CIL_CONV_I1 0x67 +#define CIL_CONV_I2 0x68 +#define CIL_CONV_I4 0x69 +#define CIL_CONV_I8 0x6a +#define CIL_CONV_R4 0x6b +#define CIL_CONV_R8 0x6c +#define CIL_CONV_U4 0x6d +#define CIL_CONV_U8 0x6e +#define CIL_CALLVIRT 0x6f + +#define CIL_LDOBJ 0x71 +#define CIL_LDSTR 0x72 +#define CIL_NEWOBJ 0x73 +#define CIL_CASTCLASS 0x74 +#define CIL_ISINST 0x75 +#define CIL_CONV_R_UN 0x76 + +#define CIL_THROW 0x7a +#define CIL_LDFLD 0x7b +#define CIL_LDFLDA 0x7c +#define CIL_STFLD 0x7d +#define CIL_LDSFLD 0x7e +#define CIL_LDSFLDA 0x7f +#define CIL_STSFLD 0x80 +#define CIL_STOBJ 0x81 +#define CIL_CONV_OVF_I1_UN 0x82 +#define CIL_CONV_OVF_I2_UN 0x83 +#define CIL_CONV_OVF_I4_UN 0x84 +#define CIL_CONV_OVF_I8_UN 0x85 +#define CIL_CONV_OVF_U1_UN 0x86 +#define CIL_CONV_OVF_U2_UN 0x87 +#define CIL_CONV_OVF_U4_UN 0x88 +#define CIL_CONV_OVF_U8_UN 0x89 +#define CIL_CONV_OVF_I_UN 0x8a +#define CIL_CONV_OVF_U_UN 0x8b +#define CIL_BOX 0x8c +#define CIL_NEWARR 0x8d +#define CIL_LDLEN 0x8e +#define CIL_LDELEMA 0x8f +#define CIL_LDELEM_I1 0x90 +#define CIL_LDELEM_U1 0x91 +#define CIL_LDELEM_I2 0x92 +#define CIL_LDELEM_U2 0x93 +#define CIL_LDELEM_I4 0x94 +#define CIL_LDELEM_U4 0x95 +#define CIL_LDELEM_I8 0x96 + +#define CIL_LDELEM_R4 0x98 +#define CIL_LDELEM_R8 0x99 +#define CIL_LDELEM_REF 0x9a + +#define CIL_STELEM_I1 0x9c +#define CIL_STELEM_I2 0x9d +#define CIL_STELEM_I4 0x9e +#define CIL_STELEM_I8 0x9f +#define CIL_STELEM_R4 0xa0 +#define CIL_STELEM_R8 0xa1 +#define CIL_STELEM_REF 0xa2 +#define CIL_LDELEM_ANY 0xa3 +#define CIL_STELEM_ANY 0xa4 +#define CIL_UNBOX_ANY 0xa5 + +#define CIL_CONV_OVF_I1 0xb3 +#define CIL_CONV_OVF_U1 0xb4 +#define CIL_CONV_OVF_I2 0xb5 +#define CIL_CONV_OVF_U2 0xb6 +#define CIL_CONV_OVF_I4 0xb7 +#define CIL_CONV_OVF_U4 0xb8 +#define CIL_CONV_OVF_I8 0xb9 +#define CIL_CONV_OVF_U8 0xba + +#define CIL_LDTOKEN 0xd0 +#define CIL_CONV_U2 0xd1 +#define CIL_CONV_U1 0xd2 +#define CIL_CONV_I 0xd3 + +#define CIL_ADD_OVF 0xd6 +#define CIL_ADD_OVF_UN 0xd7 +#define CIL_MUL_OVF 0xd8 +#define CIL_MUL_OVF_UN 0xd9 +#define CIL_SUB_OVF 0xda +#define CIL_SUB_OVF_UN 0xdb +#define CIL_ENDFINALLY 0xdc +#define CIL_LEAVE 0xdd +#define CIL_LEAVE_S 0xde + +#define CIL_CONV_U 0xe0 + +#define CIL_EXTENDED 0xfe + + +// Extended op-codes + +#define CILX_CEQ 0x01 +#define CILX_CGT 0x02 +#define CILX_CGT_UN 0x03 +#define CILX_CLT 0x04 +#define CILX_CLT_UN 0x05 +#define CILX_LOADFUNCTION 0x06 + +#define CILX_INITOBJ 0x15 +#define CILX_CONSTRAINED 0x16 + +#define CILX_RETHROW 0x1a + +#define CILX_READONLY 0x1e \ No newline at end of file diff --git a/dna/CLIFile.c b/dna/CLIFile.c new file mode 100644 index 0000000..7c4ff28 --- /dev/null +++ b/dna/CLIFile.c @@ -0,0 +1,293 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "CLIFile.h" +#include "RVA.h" +#include "MetaData.h" +#include "Thread.h" +#include "MetaDataTables.h" +#include "Type.h" + +#include "System.Array.h" +#include "System.String.h" + +// Is this exe/dll file for the .NET virtual machine? +#define DOT_NET_MACHINE 0x14c + +typedef struct tFilesLoaded_ tFilesLoaded; +struct tFilesLoaded_ { + tCLIFile *pCLIFile; + tFilesLoaded *pNext; +}; + +// Keep track of all the files currently loaded +static tFilesLoaded *pFilesLoaded = NULL; + +tMetaData* CLIFile_GetMetaDataForAssembly(unsigned char *pAssemblyName) { + tFilesLoaded *pFiles; + + // Convert "mscorlib" to "corlib" + if (strcmp(pAssemblyName, "mscorlib") == 0) { + pAssemblyName = "corlib"; + } + + // Look in already-loaded files first + pFiles = pFilesLoaded; + while (pFiles != NULL) { + tCLIFile *pCLIFile; + tMD_Assembly *pThisAssembly; + + pCLIFile = pFiles->pCLIFile; + // Get the assembly info - there is only ever one of these in the each file's metadata + pThisAssembly = MetaData_GetTableRow(pCLIFile->pMetaData, MAKE_TABLE_INDEX(0x20, 1)); + if (strcmp(pAssemblyName, pThisAssembly->name) == 0) { + // Found the correct assembly, so return its meta-data + return pCLIFile->pMetaData; + } + pFiles = pFiles->pNext; + } + + // Assembly not loaded, so load it if possible + { + tCLIFile *pCLIFile; + unsigned char fileName[128]; + sprintf(fileName, "%s.dll", pAssemblyName); + pCLIFile = CLIFile_Load(fileName); + if (pCLIFile == NULL) { + Crash("Cannot load required assembly file: %s", fileName); + } + return pCLIFile->pMetaData; + } +} + +static void* LoadFileFromDisk(char *pFileName) { + int f; + void *pData = NULL; + + f = open(pFileName, O_RDONLY|O_BINARY); + if (f >= 0) { + int len; + len = lseek(f, 0, SEEK_END); + lseek(f, 0, SEEK_SET); + // TODO: Change to use mmap() or windows equivilent + pData = mallocForever(len); + if (pData != NULL) { + int r = read(f, pData, len); + if (r != len) { + free(pData); + pData = NULL; + } + } + close(f); + } + + return pData; +} + +static tCLIFile* LoadPEFile(void *pData) { + tCLIFile *pRet = TMALLOC(tCLIFile); + + unsigned char *pMSDOSHeader = (unsigned char*)&(((unsigned char*)pData)[0]); + unsigned char *pPEHeader; + unsigned char *pPEOptionalHeader; + unsigned char *pPESectionHeaders; + unsigned char *pCLIHeader; + unsigned char *pRawMetaData; + + int i; + unsigned int lfanew; + unsigned short machine; + int numSections; + unsigned int imageBase; + int fileAlignment; + unsigned int cliHeaderRVA, cliHeaderSize; + unsigned int metaDataRVA, metaDataSize; + tMetaData *pMetaData; + + pRet->pRVA = RVA(); + pRet->pMetaData = pMetaData = MetaData(); + + lfanew = *(unsigned int*)&(pMSDOSHeader[0x3c]); + pPEHeader = pMSDOSHeader + lfanew + 4; + pPEOptionalHeader = pPEHeader + 20; + pPESectionHeaders = pPEOptionalHeader + 224; + + machine = *(unsigned short*)&(pPEHeader[0]); + if (machine != DOT_NET_MACHINE) { + return NULL; + } + numSections = *(unsigned short*)&(pPEHeader[2]); + + imageBase = *(unsigned int*)&(pPEOptionalHeader[28]); + fileAlignment = *(int*)&(pPEOptionalHeader[36]); + + for (i=0; ipRVA, pData, pSection); + } + + cliHeaderRVA = *(unsigned int*)&(pPEOptionalHeader[208]); + cliHeaderSize = *(unsigned int*)&(pPEOptionalHeader[212]); + + pCLIHeader = RVA_FindData(pRet->pRVA, cliHeaderRVA); + + metaDataRVA = *(unsigned int*)&(pCLIHeader[8]); + metaDataSize = *(unsigned int*)&(pCLIHeader[12]); + pRet->entryPoint = *(unsigned int*)&(pCLIHeader[20]); + pRawMetaData = RVA_FindData(pRet->pRVA, metaDataRVA); + + // Load all metadata + { + unsigned int versionLen = *(unsigned int*)&(pRawMetaData[12]); + unsigned int ofs, numberOfStreams; + void *pTableStream = NULL; + unsigned int tableStreamSize; + pRet->pVersion = &(pRawMetaData[16]); + log_f(1, "CLI version: %s\n", pRet->pVersion); + ofs = 16 + versionLen; + numberOfStreams = *(unsigned short*)&(pRawMetaData[ofs + 2]); + ofs += 4; + + for (i=0; i<(signed)numberOfStreams; i++) { + unsigned int streamOffset = *(unsigned int*)&pRawMetaData[ofs]; + unsigned int streamSize = *(unsigned int*)&pRawMetaData[ofs+4]; + unsigned char *pStreamName = &pRawMetaData[ofs+8]; + void *pStream = pRawMetaData + streamOffset; + ofs += (unsigned int)((strlen(pStreamName)+4) & (~0x3)) + 8; + if (strcasecmp(pStreamName, "#Strings") == 0) { + MetaData_LoadStrings(pMetaData, pStream, streamSize); + } else if (strcasecmp(pStreamName, "#US") == 0) { + MetaData_LoadUserStrings(pMetaData, pStream, streamSize); + } else if (strcasecmp(pStreamName, "#Blob") == 0) { + MetaData_LoadBlobs(pMetaData, pStream, streamSize); + } else if (strcasecmp(pStreamName, "#GUID") == 0) { + MetaData_LoadGUIDs(pMetaData, pStream, streamSize); + } else if (strcasecmp(pStreamName, "#~") == 0) { + pTableStream = pStream; + tableStreamSize = streamSize; + } + } + // Must load tables last + if (pTableStream != NULL) { + MetaData_LoadTables(pMetaData, pRet->pRVA, pTableStream, tableStreamSize); + } + } + + // Mark all generic definition types and methods as such + for (i=pMetaData->tables.numRows[MD_TABLE_GENERICPARAM]; i>0; i--) { + tMD_GenericParam *pGenericParam; + IDX_TABLE ownerIdx; + + pGenericParam = (tMD_GenericParam*)MetaData_GetTableRow + (pMetaData, MAKE_TABLE_INDEX(MD_TABLE_GENERICPARAM, i)); + ownerIdx = pGenericParam->owner; + switch (TABLE_ID(ownerIdx)) { + case MD_TABLE_TYPEDEF: + { + tMD_TypeDef *pTypeDef = (tMD_TypeDef*)MetaData_GetTableRow(pMetaData, ownerIdx); + pTypeDef->isGenericDefinition = 1; + } + break; + case MD_TABLE_METHODDEF: + { + tMD_MethodDef *pMethodDef = (tMD_MethodDef*)MetaData_GetTableRow(pMetaData, ownerIdx); + pMethodDef->isGenericDefinition = 1; + } + break; + default: + Crash("Wrong generic parameter owner: 0x%08x", ownerIdx); + } + } + + // Mark all nested classes as such + for (i=pMetaData->tables.numRows[MD_TABLE_NESTEDCLASS]; i>0; i--) { + tMD_NestedClass *pNested; + tMD_TypeDef *pParent, *pChild; + + pNested = (tMD_NestedClass*)MetaData_GetTableRow(pMetaData, MAKE_TABLE_INDEX(MD_TABLE_NESTEDCLASS, i)); + pParent = (tMD_TypeDef*)MetaData_GetTableRow(pMetaData, pNested->enclosingClass); + pChild = (tMD_TypeDef*)MetaData_GetTableRow(pMetaData, pNested->nestedClass); + pChild->pNestedIn = pParent; + } + + return pRet; +} + +tCLIFile* CLIFile_Load(char *pFileName) { + void *pRawFile; + tCLIFile *pRet; + tFilesLoaded *pNewFile; + + pRawFile = LoadFileFromDisk(pFileName); + + if (pRawFile == NULL) { + Crash("Cannot load file: %s", pFileName); + } + + log_f(1, "\nLoading file: %s\n", pFileName); + + pRet = LoadPEFile(pRawFile); + pRet->pFileName = (char*)mallocForever((U32)strlen(pFileName) + 1); + strcpy(pRet->pFileName, pFileName); + + // Record that we've loaded this file + pNewFile = TMALLOCFOREVER(tFilesLoaded); + pNewFile->pCLIFile = pRet; + pNewFile->pNext = pFilesLoaded; + pFilesLoaded = pNewFile; + + return pRet; +} + +I32 CLIFile_Execute(tCLIFile *pThis, int argc, char **argp) { + tThread *pThread; + HEAP_PTR args; + int i; + + // Create a string array for the program arguments + // Don't include the argument that is the program name. + argc--; + argp++; + args = SystemArray_NewVector(types[TYPE_SYSTEM_ARRAY_STRING], argc); + Heap_MakeUndeletable(args); + for (i = 0; i < argc; i++) { + HEAP_PTR arg = SystemString_FromCharPtrASCII(argp[i]); + SystemArray_StoreElement(args, i, (PTR)&arg); + } + + // Create the main application thread + pThread = Thread(); + Thread_SetEntryPoint(pThread, pThis->pMetaData, pThis->entryPoint, (PTR)&args, sizeof(void*)); + + return Thread_Execute(); +} + +void CLIFile_GetHeapRoots(tHeapRoots *pHeapRoots) { + tFilesLoaded *pFile; + + pFile = pFilesLoaded; + while (pFile != NULL) { + MetaData_GetHeapRoots(pHeapRoots, pFile->pCLIFile->pMetaData); + pFile = pFile->pNext; + } +} diff --git a/dna/CLIFile.h b/dna/CLIFile.h new file mode 100644 index 0000000..a7c3911 --- /dev/null +++ b/dna/CLIFile.h @@ -0,0 +1,50 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined (__CLIFILE_H) +#define __CLIFILE_H + +#include "RVA.h" +#include "Types.h" +#include "MetaData.h" + +typedef struct tCLIFile_ tCLIFile; +struct tCLIFile_ { + // The filename + char *pFileName; + // The RVA sections of this file + tRVA *pRVA; + // NULL-terminated UTF8 string of file version + unsigned char *pVersion; + // The entry point token if this is executable, 0 if it isn't + IDX_TABLE entryPoint; + + tMetaData *pMetaData; +}; + +// static methods +tMetaData* CLIFile_GetMetaDataForAssembly(unsigned char *pAssemblyName); +void CLIFile_GetHeapRoots(tHeapRoots *pHeapRoots); + +// instance methods +tCLIFile* CLIFile_Load(char *pFileName); +I32 CLIFile_Execute(tCLIFile *pThis, int argc, char **argp); + +#endif diff --git a/dna/Compat.h b/dna/Compat.h new file mode 100644 index 0000000..ebb2a90 --- /dev/null +++ b/dna/Compat.h @@ -0,0 +1,92 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined (__COMPAT_H) +#define __COMPAT_H + +#include +#include +#include + +#ifdef WIN32 +#include // winsock2.h must be included before windows.h +#include +#include +#include +// Disable warning about deprecated functions +#pragma warning(disable:4996) +// Disable warning about converting pointer to int +#pragma warning(disable:4311) +// Disable warning about converting int to pointer +#pragma warning(disable:4312) +// convert warning to error about not all control paths return value in a function +#pragma warning(error:4715) +// convert warning to error about no return value in a function +#pragma warning(error:4716) +// convert warning to error about function must return a value +#pragma warning(error:4033) +// convert warning to error about no pointer mismatch +#pragma warning(error:4022) +// convert warning to error about pointer differs in indirection +#pragma warning(error:4047) +// convert warning to error about function undefined +#pragma warning(error:4013) +// convert warning to error about too many parameters to function call +#pragma warning(error:4020) +// convert warning to error about incompatible types +#pragma warning(error:4133) +// convert warning to error about different types for parameters in function call +#pragma warning(error:4024) +// convert warning to error about different parameter lists +#pragma warning(error:4113) +// convert warning to error about macro not enough parameters +#pragma warning(error:4003) + +#define strcasecmp stricmp + +#define LIB_PREFIX "" +#define LIB_SUFFIX "dll" +#define STDCALL __stdcall + +#else // WIN32 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define O_BINARY 0 +#define LIB_PREFIX "./" +#define LIB_SUFFIX "so" +#define STDCALL + +#endif // WIN32 + +#define TMALLOC(t) (t*)malloc(sizeof(t)) +#define TMALLOCFOREVER(t) (t*)mallocForever(sizeof(t)) + +#endif diff --git a/dna/Config.h b/dna/Config.h new file mode 100644 index 0000000..709fd23 --- /dev/null +++ b/dna/Config.h @@ -0,0 +1,61 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __CONFIG_H +#define __CONFIG_H + +// Diagnostic stuff +// Some of this will only work on Windows +// (although could be implemented on other platforms with a little work. +// The issue is that a very fast time function is needed. It uses the rdtsc +// instruction on x86 - so the results are in ticks, not seconds) + +// Count how many times each .NET method is called +#undef DIAG_METHOD_CALLS + +// Measure how much time is spent in each .NET opcode +// This only works on Windows +// This is not currently implemented, after the change to threaded code +#undef DIAG_OPCODE_TIMES + +// Count how many times each .NET opcode is used +#ifdef _DEBUG +#undef DIAG_OPCODE_USE +#endif + +// Measure how much time is spent in the garbage collector +#undef DIAG_GC + +// Measure how long the entire .NET programme execution takes +#define DIAG_TOTAL_TIME + + + +// Non-diagnostic stuff + +// Generate combined (dynamic) .NET opcodes. +// This does work, but currently has no intellegence about which opcodes +// are worth combining, so it uses lots of memory and on some platforms +// will not lead to a performance increase. +//#define GEN_COMBINED_OPCODES +#define GEN_COMBINED_OPCODES_MAX_MEMORY 0x4000 +#define GEN_COMBINED_OPCODES_CALL_TRIGGER 20 + +#endif diff --git a/dna/Cultures/_ b/dna/Cultures/_ new file mode 100644 index 0000000..2ff1937 --- /dev/null +++ b/dna/Cultures/_ @@ -0,0 +1,72 @@ + +0x007f + +Invariant Language (Invariant Country) +Invariant Language (Invariant Country) +Invariant Language (Invariant Country) +iv +IVL +IVL +GregorianCalendar:Localized +GregorianCalendar:Localized +66 + +False +1252 +37 +False +, +10000 +437 +2 +. +, +3 +0 +0 +¤ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +0 +dddd, dd MMMM yyyy HH:mm:ss +dddd, dd MMMM yyyy +HH:mm:ss +MMMM dd +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar +HH:mm:ss +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +MM/dd/yyyy +Su,Mo,Tu,We,Th,Fr,Sa +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +yyyy MMMM diff --git a/dna/Cultures/af b/dna/Cultures/af new file mode 100644 index 0000000..d95bcc3 --- /dev/null +++ b/dna/Cultures/af @@ -0,0 +1,20 @@ +af +0x0036 + +Afrikaans +Afrikaans +Afrikaans +af +afr +AFK +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +af +True +1252 +500 +False +, +10000 +850 diff --git a/dna/Cultures/af-ZA b/dna/Cultures/af-ZA new file mode 100644 index 0000000..2c22503 --- /dev/null +++ b/dna/Cultures/af-ZA @@ -0,0 +1,72 @@ +af-ZA +0x0436 +af +Afrikaans (South Africa) +Afrikaans (Suid Afrika) +Afrikaans (South Africa) +af +afr +AFK +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +af-ZA +False +1252 +500 +False +, +10000 +850 +2 +. +, +3 +2 +2 +R +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +1 +1 +% +‰ +Infinity ++ +Son,Maan,Dins,Woen,Dond,Vry,Sat +Jan,Feb,Mar,Apr,Mei,Jun,Jul,Aug,Sep,Okt,Nov,Des, +Jan,Feb,Mar,Apr,Mei,Jun,Jul,Aug,Sep,Okt,Nov,Des, + +0 +/ +Sondag,Maandag,Dinsdag,Woensdag,Donderdag,Vrydag,Saterdag +0 +dd MMMM yyyy hh:mm:ss tt +dd MMMM yyyy +hh:mm:ss tt +dd MMMM +Januarie,Februarie,Maart,April,Mei,Junie,Julie,Augustus,September,Oktober,November,Desember, +Januarie,Februarie,Maart,April,Mei,Junie,Julie,Augustus,September,Oktober,November,Desember, +Gregoriaanse kalender +hh:mm:ss tt +nm +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy/MM/dd +So,Ma,Di,Wo,Do,Vr,Sa +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/ar b/dna/Cultures/ar new file mode 100644 index 0000000..188fec2 --- /dev/null +++ b/dna/Cultures/ar @@ -0,0 +1,20 @@ +ar +0x0001 + +Arabic +العربية +Arabic +ar +ara +ARA +HijriCalendar +HijriCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:Arabic,GregorianCalendar:Localized,GregorianCalendar:TransliteratedFrench +65 +ar +True +1256 +20420 +True +; +10004 +720 diff --git a/dna/Cultures/ar-AE b/dna/Cultures/ar-AE new file mode 100644 index 0000000..e26e458 --- /dev/null +++ b/dna/Cultures/ar-AE @@ -0,0 +1,72 @@ +ar-AE +0x3801 +ar +Arabic (U.A.E.) +العربية (الإمارات العربية المتحدة) +Arabic (U.A.E.) +ar +ara +ARU +GregorianCalendar:Localized +GregorianCalendar:Localized,UmAlQuraCalendar,HijriCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:Arabic,GregorianCalendar:TransliteratedFrench +70 +ar-AE +False +1256 +20420 +True +; +10004 +720 +2 +. +, +3 +3 +2 +د.إ.‏ +0 +ليس برقم +٠,١,٢,٣,٤,٥,٦,٧,٨,٩ +-لا نهاية +- +2 +. +, +3 +3 +2 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +ص +0 +/ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +6 +dd MMMM, yyyy hh:mm:ss tt +dd MMMM, yyyy +hh:mm:ss tt +dd MMMM +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +التقويم الميلادي (تسمية إنجليزية)‏ +hh:mm:ss tt +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +أ,ا,ث,أ,خ,ج,س +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ar-BH b/dna/Cultures/ar-BH new file mode 100644 index 0000000..6fe6fef --- /dev/null +++ b/dna/Cultures/ar-BH @@ -0,0 +1,72 @@ +ar-BH +0x3c01 +ar +Arabic (Bahrain) +العربية (البحرين) +Arabic (Bahrain) +ar +ara +ARH +GregorianCalendar:Localized +GregorianCalendar:Localized,UmAlQuraCalendar,HijriCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:Arabic,GregorianCalendar:TransliteratedFrench +70 +ar-BH +False +1256 +20420 +True +; +10004 +720 +3 +. +, +3 +3 +2 +د.ب.‏ +0 +ليس برقم +٠,١,٢,٣,٤,٥,٦,٧,٨,٩ +-لا نهاية +- +3 +. +, +3 +3 +3 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +ص +0 +/ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +6 +dd MMMM, yyyy hh:mm:ss tt +dd MMMM, yyyy +hh:mm:ss tt +dd MMMM +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +التقويم الميلادي (تسمية إنجليزية)‏ +hh:mm:ss tt +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +أ,ا,ث,أ,خ,ج,س +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ar-DZ b/dna/Cultures/ar-DZ new file mode 100644 index 0000000..e3fce8d --- /dev/null +++ b/dna/Cultures/ar-DZ @@ -0,0 +1,72 @@ +ar-DZ +0x1401 +ar +Arabic (Algeria) +العربية (الجزائر) +Arabic (Algeria) +ar +ara +ARG +GregorianCalendar:Localized +GregorianCalendar:Localized,HijriCalendar,UmAlQuraCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:Arabic,GregorianCalendar:TransliteratedEnglish +70 +ar-DZ +False +1256 +20420 +True +; +10004 +720 +2 +. +, +3 +3 +2 +د.ج.‏ +1 +ليس برقم +0,1,2,3,4,5,6,7,8,9 +-لا نهاية +- +2 +. +, +3 +3 +2 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +جانفييه,فيفرييه,مارس,أفريل,مي,جوان,جوييه,أوت,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +جانفييه,فيفرييه,مارس,أفريل,مي,جوان,جوييه,أوت,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +ص +0 +- +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +6 +dd MMMM, yyyy H:mm:ss +dd MMMM, yyyy +H:mm:ss +dd MMMM +جانفييه,فيفرييه,مارس,أفريل,مي,جوان,جوييه,أوت,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +جانفييه,فيفرييه,مارس,أفريل,مي,جوان,جوييه,أوت,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +التقويم الميلادي (تسمية فرنسية)‏ +H:mm:ss +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yyyy +أ,ا,ث,أ,خ,ج,س +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ar-EG b/dna/Cultures/ar-EG new file mode 100644 index 0000000..b32f223 --- /dev/null +++ b/dna/Cultures/ar-EG @@ -0,0 +1,72 @@ +ar-EG +0x0c01 +ar +Arabic (Egypt) +العربية (مصر) +Arabic (Egypt) +ar +ara +ARE +GregorianCalendar:Localized +GregorianCalendar:Localized,UmAlQuraCalendar,HijriCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:Arabic,GregorianCalendar:TransliteratedFrench +70 +ar-EG +False +1256 +20420 +True +; +10004 +720 +3 +. +, +3 +3 +2 +ج.م.‏ +0 +ليس برقم +٠,١,٢,٣,٤,٥,٦,٧,٨,٩ +-لا نهاية +- +3 +. +, +3 +3 +3 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +ص +0 +/ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +6 +dd MMMM, yyyy hh:mm:ss tt +dd MMMM, yyyy +hh:mm:ss tt +dd MMMM +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +التقويم الميلادي (تسمية إنجليزية)‏ +hh:mm:ss tt +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +أ,ا,ث,أ,خ,ج,س +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ar-IQ b/dna/Cultures/ar-IQ new file mode 100644 index 0000000..e274801 --- /dev/null +++ b/dna/Cultures/ar-IQ @@ -0,0 +1,72 @@ +ar-IQ +0x0801 +ar +Arabic (Iraq) +العربية (العراق) +Arabic (Iraq) +ar +ara +ARI +GregorianCalendar:Localized +GregorianCalendar:Localized,UmAlQuraCalendar,HijriCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:TransliteratedEnglish,GregorianCalendar:TransliteratedFrench +70 +ar-IQ +False +1256 +20420 +True +; +10004 +720 +2 +. +, +3 +3 +2 +د.ع.‏ +0 +ليس برقم +٠,١,٢,٣,٤,٥,٦,٧,٨,٩ +-لا نهاية +- +2 +. +, +3 +3 +2 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +ص +0 +/ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +6 +dd MMMM, yyyy hh:mm:ss tt +dd MMMM, yyyy +hh:mm:ss tt +dd MMMM +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +التقويم الميلادي (عربي)‏ +hh:mm:ss tt +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +أ,ا,ث,أ,خ,ج,س +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ar-JO b/dna/Cultures/ar-JO new file mode 100644 index 0000000..a620277 --- /dev/null +++ b/dna/Cultures/ar-JO @@ -0,0 +1,72 @@ +ar-JO +0x2c01 +ar +Arabic (Jordan) +العربية (الأردن) +Arabic (Jordan) +ar +ara +ARJ +GregorianCalendar:Localized +GregorianCalendar:Localized,UmAlQuraCalendar,HijriCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:TransliteratedEnglish,GregorianCalendar:TransliteratedFrench +70 +ar-JO +False +1256 +20420 +True +; +10004 +720 +3 +. +, +3 +3 +2 +د.ا.‏ +0 +ليس برقم +٠,١,٢,٣,٤,٥,٦,٧,٨,٩ +-لا نهاية +- +3 +. +, +3 +3 +3 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +ص +0 +/ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +6 +dd MMMM, yyyy hh:mm:ss tt +dd MMMM, yyyy +hh:mm:ss tt +dd MMMM +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +التقويم الميلادي (عربي)‏ +hh:mm:ss tt +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +أ,ا,ث,أ,خ,ج,س +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ar-KW b/dna/Cultures/ar-KW new file mode 100644 index 0000000..e0cfa12 --- /dev/null +++ b/dna/Cultures/ar-KW @@ -0,0 +1,72 @@ +ar-KW +0x3401 +ar +Arabic (Kuwait) +العربية (الكويت) +Arabic (Kuwait) +ar +ara +ARK +GregorianCalendar:Localized +GregorianCalendar:Localized,HijriCalendar,UmAlQuraCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:Arabic,GregorianCalendar:TransliteratedFrench +70 +ar-KW +False +1256 +20420 +True +; +10004 +720 +3 +. +, +3 +3 +2 +د.ك.‏ +0 +ليس برقم +٠,١,٢,٣,٤,٥,٦,٧,٨,٩ +-لا نهاية +- +3 +. +, +3 +3 +3 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +ص +0 +/ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +6 +dd MMMM, yyyy hh:mm:ss tt +dd MMMM, yyyy +hh:mm:ss tt +dd MMMM +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +التقويم الميلادي (تسمية إنجليزية)‏ +hh:mm:ss tt +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +أ,ا,ث,أ,خ,ج,س +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ar-LB b/dna/Cultures/ar-LB new file mode 100644 index 0000000..d6ea651 --- /dev/null +++ b/dna/Cultures/ar-LB @@ -0,0 +1,72 @@ +ar-LB +0x3001 +ar +Arabic (Lebanon) +العربية (لبنان) +Arabic (Lebanon) +ar +ara +ARB +GregorianCalendar:Localized +GregorianCalendar:Localized,UmAlQuraCalendar,HijriCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:TransliteratedEnglish,GregorianCalendar:TransliteratedFrench +70 +ar-LB +False +1256 +20420 +True +; +10004 +720 +2 +. +, +3 +3 +2 +ل.ل.‏ +0 +ليس برقم +٠,١,٢,٣,٤,٥,٦,٧,٨,٩ +-لا نهاية +- +2 +. +, +3 +3 +2 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +ص +0 +/ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +1 +dd MMMM, yyyy hh:mm:ss tt +dd MMMM, yyyy +hh:mm:ss tt +dd MMMM +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +التقويم الميلادي (عربي)‏ +hh:mm:ss tt +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +أ,ا,ث,أ,خ,ج,س +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ar-LY b/dna/Cultures/ar-LY new file mode 100644 index 0000000..1863a61 --- /dev/null +++ b/dna/Cultures/ar-LY @@ -0,0 +1,72 @@ +ar-LY +0x1001 +ar +Arabic (Libya) +العربية (ليبيا) +Arabic (Libya) +ar +ara +ARL +GregorianCalendar:Localized +GregorianCalendar:Localized,HijriCalendar,UmAlQuraCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:Arabic,GregorianCalendar:TransliteratedFrench +70 +ar-LY +False +1256 +20420 +True +; +10004 +720 +2 +. +, +3 +3 +2 +د.ل.‏ +1 +ليس برقم +0,1,2,3,4,5,6,7,8,9 +-لا نهاية +- +2 +. +, +3 +3 +2 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +ص +0 +/ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +6 +dd MMMM, yyyy hh:mm:ss tt +dd MMMM, yyyy +hh:mm:ss tt +dd MMMM +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +التقويم الميلادي (تسمية إنجليزية)‏ +hh:mm:ss tt +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +أ,ا,ث,أ,خ,ج,س +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ar-MA b/dna/Cultures/ar-MA new file mode 100644 index 0000000..1b6fcce --- /dev/null +++ b/dna/Cultures/ar-MA @@ -0,0 +1,72 @@ +ar-MA +0x1801 +ar +Arabic (Morocco) +العربية (المملكة المغربية) +Arabic (Morocco) +ar +ara +ARM +GregorianCalendar:Localized +GregorianCalendar:Localized,HijriCalendar,UmAlQuraCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:Arabic,GregorianCalendar:TransliteratedEnglish +70 +ar-MA +False +1256 +20420 +True +; +10004 +720 +2 +. +, +3 +3 +2 +د.م.‏ +1 +ليس برقم +0,1,2,3,4,5,6,7,8,9 +-لا نهاية +- +2 +. +, +3 +3 +2 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +يناير,فبراير,مارس,ابريل,ماي,يونيو,يوليوز,غشت,شتنبر,اكتوبر,نونبر,دجنبر, +يناير,فبراير,مارس,ابريل,ماي,يونيو,يوليوز,غشت,شتنبر,اكتوبر,نونبر,دجنبر, +ص +0 +- +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +1 +dd MMMM, yyyy H:mm:ss +dd MMMM, yyyy +H:mm:ss +dd MMMM +يناير,فبراير,مارس,ابريل,ماي,يونيو,يوليوز,غشت,شتنبر,اكتوبر,نونبر,دجنبر, +يناير,فبراير,مارس,ابريل,ماي,يونيو,يوليوز,غشت,شتنبر,اكتوبر,نونبر,دجنبر, +التقويم الميلادي (تسمية فرنسية)‏ +H:mm:ss +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yyyy +أ,ا,ث,أ,خ,ج,س +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ar-OM b/dna/Cultures/ar-OM new file mode 100644 index 0000000..e48006f --- /dev/null +++ b/dna/Cultures/ar-OM @@ -0,0 +1,72 @@ +ar-OM +0x2001 +ar +Arabic (Oman) +العربية (عمان) +Arabic (Oman) +ar +ara +ARO +GregorianCalendar:Localized +GregorianCalendar:Localized,HijriCalendar,UmAlQuraCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:Arabic,GregorianCalendar:TransliteratedFrench +70 +ar-OM +False +1256 +20420 +True +; +10004 +720 +2 +. +, +3 +3 +2 +ر.ع.‏ +0 +ليس برقم +٠,١,٢,٣,٤,٥,٦,٧,٨,٩ +-لا نهاية +- +2 +. +, +3 +3 +2 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +ص +0 +/ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +6 +dd MMMM, yyyy hh:mm:ss tt +dd MMMM, yyyy +hh:mm:ss tt +dd MMMM +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +التقويم الميلادي (تسمية إنجليزية)‏ +hh:mm:ss tt +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +أ,ا,ث,أ,خ,ج,س +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ar-QA b/dna/Cultures/ar-QA new file mode 100644 index 0000000..df680df --- /dev/null +++ b/dna/Cultures/ar-QA @@ -0,0 +1,72 @@ +ar-QA +0x4001 +ar +Arabic (Qatar) +العربية (قطر) +Arabic (Qatar) +ar +ara +ARQ +GregorianCalendar:Localized +GregorianCalendar:Localized,UmAlQuraCalendar,HijriCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:Arabic,GregorianCalendar:TransliteratedFrench +70 +ar-QA +False +1256 +20420 +True +; +10004 +720 +2 +. +, +3 +3 +2 +ر.ق.‏ +0 +ليس برقم +٠,١,٢,٣,٤,٥,٦,٧,٨,٩ +-لا نهاية +- +2 +. +, +3 +3 +2 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +ص +0 +/ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +6 +dd MMMM, yyyy hh:mm:ss tt +dd MMMM, yyyy +hh:mm:ss tt +dd MMMM +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +التقويم الميلادي (تسمية إنجليزية)‏ +hh:mm:ss tt +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +أ,ا,ث,أ,خ,ج,س +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ar-SA b/dna/Cultures/ar-SA new file mode 100644 index 0000000..0bb4d52 --- /dev/null +++ b/dna/Cultures/ar-SA @@ -0,0 +1,72 @@ +ar-SA +0x0401 +ar +Arabic (Saudi Arabia) +العربية (المملكة العربية السعودية) +Arabic (Saudi Arabia) +ar +ara +ARA +HijriCalendar +HijriCalendar,UmAlQuraCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:Arabic,GregorianCalendar:Localized,GregorianCalendar:TransliteratedFrench +70 +ar-SA +False +1256 +20420 +True +; +10004 +720 +2 +. +, +3 +3 +2 +ر.س.‏ +0 +ليس برقم +٠,١,٢,٣,٤,٥,٦,٧,٨,٩ +-لا نهاية +- +2 +. +, +3 +3 +2 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +محرم,صفر,ربيع الاول,ربيع الثاني,جمادى الاولى,جمادى الثانية,رجب,شعبان,رمضان,شوال,ذو القعدة,ذو الحجة, +محرم,صفر,ربيع الاول,ربيع الثاني,جمادى الاولى,جمادى الثانية,رجب,شعبان,رمضان,شوال,ذو القعدة,ذو الحجة, +ص +0 +/ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +6 +dd/MMMM/yyyy hh:mm:ss tt +dd/MMMM/yyyy +hh:mm:ss tt +dd MMMM +محرم,صفر,ربيع الأول,ربيع الثاني,جمادى الأولى,جمادى الثانية,رجب,شعبان,رمضان,شوال,ذو القعدة,ذو الحجة, +محرم,صفر,ربيع الأول,ربيع الثاني,جمادى الأولى,جمادى الثانية,رجب,شعبان,رمضان,شوال,ذو القعدة,ذو الحجة, +التقويم الهجري +hh:mm:ss tt +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yy +ح,ن,ث,ر,خ,ج,س +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ar-SY b/dna/Cultures/ar-SY new file mode 100644 index 0000000..98cce0d --- /dev/null +++ b/dna/Cultures/ar-SY @@ -0,0 +1,72 @@ +ar-SY +0x2801 +ar +Arabic (Syria) +العربية (سوريا) +Arabic (Syria) +ar +ara +ARS +GregorianCalendar:Localized +GregorianCalendar:Localized,UmAlQuraCalendar,HijriCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:TransliteratedEnglish,GregorianCalendar:TransliteratedFrench +70 +ar-SY +False +1256 +20420 +True +; +10004 +720 +2 +. +, +3 +3 +2 +ل.س.‏ +0 +ليس برقم +٠,١,٢,٣,٤,٥,٦,٧,٨,٩ +-لا نهاية +- +2 +. +, +3 +3 +2 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +ص +0 +/ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +6 +dd MMMM, yyyy hh:mm:ss tt +dd MMMM, yyyy +hh:mm:ss tt +dd MMMM +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +كانون الثاني,شباط,آذار,نيسان,أيار,حزيران,تموز,آب,أيلول,تشرين الأول,تشرين الثاني,كانون الأول, +التقويم الميلادي (عربي)‏ +hh:mm:ss tt +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +أ,ا,ث,أ,خ,ج,س +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ar-TN b/dna/Cultures/ar-TN new file mode 100644 index 0000000..f1e1e1a --- /dev/null +++ b/dna/Cultures/ar-TN @@ -0,0 +1,72 @@ +ar-TN +0x1c01 +ar +Arabic (Tunisia) +العربية (تونس) +Arabic (Tunisia) +ar +ara +ART +GregorianCalendar:Localized +GregorianCalendar:Localized,HijriCalendar,UmAlQuraCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:Arabic,GregorianCalendar:TransliteratedEnglish +70 +ar-TN +False +1256 +20420 +True +; +10004 +720 +3 +. +, +3 +3 +2 +د.ت.‏ +1 +ليس برقم +0,1,2,3,4,5,6,7,8,9 +-لا نهاية +- +3 +. +, +3 +3 +3 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +جانفي,فيفري,مارس,افريل,ماي,جوان,جويلية,اوت,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +جانفي,فيفري,مارس,افريل,ماي,جوان,جويلية,اوت,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +ص +0 +- +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +1 +dd MMMM, yyyy H:mm:ss +dd MMMM, yyyy +H:mm:ss +dd MMMM +جانفي,فيفري,مارس,افريل,ماي,جوان,جويلية,اوت,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +جانفي,فيفري,مارس,افريل,ماي,جوان,جويلية,اوت,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +التقويم الميلادي (تسمية فرنسية)‏ +H:mm:ss +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yyyy +أ,ا,ث,أ,خ,ج,س +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ar-YE b/dna/Cultures/ar-YE new file mode 100644 index 0000000..7d680fb --- /dev/null +++ b/dna/Cultures/ar-YE @@ -0,0 +1,72 @@ +ar-YE +0x2401 +ar +Arabic (Yemen) +العربية (اليمن) +Arabic (Yemen) +ar +ara +ARY +GregorianCalendar:Localized +GregorianCalendar:Localized,UmAlQuraCalendar,HijriCalendar,GregorianCalendar:USEnglish,GregorianCalendar:MiddleEastFrench,GregorianCalendar:Arabic,GregorianCalendar:TransliteratedFrench +70 +ar-YE +False +1256 +20420 +True +; +10004 +720 +2 +. +, +3 +3 +2 +ر.ي.‏ +0 +ليس برقم +٠,١,٢,٣,٤,٥,٦,٧,٨,٩ +-لا نهاية +- +2 +. +, +3 +3 +2 +. +, +3 +0 +0 +% +‰ ++لا نهاية ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +ص +0 +/ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +6 +dd MMMM, yyyy hh:mm:ss tt +dd MMMM, yyyy +hh:mm:ss tt +dd MMMM +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +يناير,فبراير,مارس,ابريل,مايو,يونيو,يوليو,اغسطس,سبتمبر,اكتوبر,نوفمبر,ديسمبر, +التقويم الميلادي (تسمية إنجليزية)‏ +hh:mm:ss tt +م +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +أ,ا,ث,أ,خ,ج,س +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/az b/dna/Cultures/az new file mode 100644 index 0000000..09f92df --- /dev/null +++ b/dna/Cultures/az @@ -0,0 +1,20 @@ +az +0x002c + +Azeri +Azərbaycan­ılı +Azeri +az +aze +AZE +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +az +True +1254 +20905 +False +; +10081 +857 diff --git a/dna/Cultures/az-Cyrl-AZ b/dna/Cultures/az-Cyrl-AZ new file mode 100644 index 0000000..13e826c --- /dev/null +++ b/dna/Cultures/az-Cyrl-AZ @@ -0,0 +1,72 @@ +az-Cyrl-AZ +0x082c +az +Azeri (Cyrillic, Azerbaijan) +Азәрбајҹан (Азәрбајҹан) +Azeri (Cyrillic, Azerbaijan) +az +aze +AZE +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +az-Cyrl-AZ +False +1251 +20880 +False +; +10007 +866 +2 +, +  +3 +8 +3 +ман. +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +1 +1 +% +‰ +Infinity ++ +Б,Бе,Ча,Ч,Ҹа,Ҹ,Ш +Јан,Фев,Мар,Апр,мая,ијун,ијул,Авг,Сен,Окт,Ноя,Дек, +Јан,Фев,Мар,Апр,Мај,Ијун,Ијул,Авг,Сен,Окт,Ноя,Дек, + +0 +. +Базар,Базар ертәси,Чәршәнбә ахшамы,Чәршәнбә,Ҹүмә ахшамы,Ҹүмә,Шәнбә +1 +d MMMM yyyy H:mm:ss +d MMMM yyyy +H:mm:ss +d MMMM +јанвар,феврал,март,апрел,мај,ијун,ијул,август,сентјабр,октјабр,нојабр,декабр, +Јанвар,Феврал,Март,Апрел,Мај,Ијун,Ијул,Август,Сентјабр,Октјабр,Нојабр,Декабр, +Гриуориан +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +Б,Бе,Ча,Ч,Ҹа,Ҹ,Ш +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/az-Latn-AZ b/dna/Cultures/az-Latn-AZ new file mode 100644 index 0000000..cc9d213 --- /dev/null +++ b/dna/Cultures/az-Latn-AZ @@ -0,0 +1,72 @@ +az-Latn-AZ +0x042c +az +Azeri (Latin, Azerbaijan) +Azərbaycan­ılı (Azərbaycanca) +Azeri (Latin, Azerbaijan) +az +aze +AZE +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +az-Latn-AZ +False +1254 +20905 +False +; +10081 +857 +2 +, +  +3 +8 +3 +man. +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +1 +1 +% +‰ +Infinity ++ +B,Be,Ça,Ç,Ca,C,Ş +Yan,Fev,Mar,Apr,May,İyun,İyul,Avg,Sen,Okt,Noy,Dek, +Yan,Fev,Mar,Apr,May,İyun,İyul,Avg,Sen,Okt,Noy,Dek, + +0 +. +Bazar,Bazar ertəsi,Çərşənbə axşamı,Çərşənbə,Cümə axşamı,Cümə,Şənbə +1 +d MMMM yyyy H:mm:ss +d MMMM yyyy +H:mm:ss +d MMMM +yanvar,fevral,mart,aprel,may,iyun,iyul,avgust,sentyabr,oktyabr,noyabr,dekabr, +Yanvar,Fevral,Mart,Aprel,May,İyun,İyul,Avgust,Sentyabr,Oktyabr,Noyabr,Dekabr, +Qriqorian +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +B,Be,Ça,Ç,Ca,C,Ş +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/be b/dna/Cultures/be new file mode 100644 index 0000000..dd95954 --- /dev/null +++ b/dna/Cultures/be @@ -0,0 +1,20 @@ +be +0x0023 + +Belarusian +Беларускі +Belarusian +be +bel +BEL +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +be +True +1251 +500 +False +; +10007 +866 diff --git a/dna/Cultures/be-BY b/dna/Cultures/be-BY new file mode 100644 index 0000000..cadc657 --- /dev/null +++ b/dna/Cultures/be-BY @@ -0,0 +1,72 @@ +be-BY +0x0423 +be +Belarusian (Belarus) +Беларускі (Беларусь) +Belarusian (Belarus) +be +bel +BEL +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +be-BY +False +1251 +500 +False +; +10007 +866 +2 +, +  +3 +8 +3 +р. +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +Infinity ++ +нд,пн,аў,ср,чц,пт,сб +Сту,Лют,Сак,Кра,Май,Чэр,Ліп,Жні,Вер,Кас,Ліс,Сне, +Сту,Лют,Сак,Кра,Май,Чэр,Ліп,Жні,Вер,Кас,Ліс,Сне, + +0 +. +нядзеля,панядзелак,аўторак,серада,чацвер,пятніца,субота +1 +d MMMM yyyy H:mm:ss +d MMMM yyyy +H:mm:ss +d MMMM +студзеня,лютага,сакавіка,красавіка,мая,чэрвеня,ліпеня,жніўня,верасня,кастрычніка,лістапада,снежня, +Студзень,Люты,Сакавік,Красавік,Май,Чэрвень,Ліпень,Жнівень,Верасень,Кастрычнік,Лістапад,Снежань, +григорианский календарь +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +нд,пн,аў,ср,чц,пт,сб +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/bg b/dna/Cultures/bg new file mode 100644 index 0000000..d318de0 --- /dev/null +++ b/dna/Cultures/bg @@ -0,0 +1,20 @@ +bg +0x0002 + +Bulgarian +български +Bulgarian +bg +bul +BGR +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +bg +True +1251 +20420 +False +; +10007 +866 diff --git a/dna/Cultures/bg-BG b/dna/Cultures/bg-BG new file mode 100644 index 0000000..d8ee323 --- /dev/null +++ b/dna/Cultures/bg-BG @@ -0,0 +1,72 @@ +bg-BG +0x0402 +bg +Bulgarian (Bulgaria) +български (България) +Bulgarian (Bulgaria) +bg +bul +BGR +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +bg-BG +False +1251 +20420 +False +; +10007 +866 +2 +, +  +3 +8 +3 +лв +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +Infinity ++ +Нд,Пн,Вт,Ср,Чт,Пт,Сб +Януари,Февруари,Март,Април,Май,Юни,Юли,Август,Септември,Октомври,Ноември,Декември, +Януари,Февруари,Март,Април,Май,Юни,Юли,Август,Септември,Октомври,Ноември,Декември, + +0 +. +неделя,понеделник,вторник,сряда,четвъртък,петък,събота +1 +dd MMMM yyyy 'г.' HH:mm:ss +dd MMMM yyyy 'г.' +HH:mm:ss +dd MMMM +Януари,Февруари,Март,Април,Май,Юни,Юли,Август,Септември,Октомври,Ноември,Декември, +Януари,Февруари,Март,Април,Май,Юни,Юли,Август,Септември,Октомври,Ноември,Декември, +Грегориански календар +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.M.yyyy 'г.' +не,по,вт,ср,че,пе,съ +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy 'г.' diff --git a/dna/Cultures/bn-IN b/dna/Cultures/bn-IN new file mode 100644 index 0000000..5a51554 --- /dev/null +++ b/dna/Cultures/bn-IN @@ -0,0 +1,72 @@ +bn-IN +0x0445 + +Bengali (India) +বাঢলা (ভারত) +Bengali (India) +bn +bn +BNG +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +bn-IN +False +0 +500 +False +, +2 +1 +2 +. +, +3,2 +12 +2 +টা +1 +NaN +০,১,২,৩,৪,৫,৬,৭,৮,৯ +-Infinity +- +2 +. +, +3,2 +1 +2 +. +, +3,2 +0 +0 +% +‰ +Infinity ++ +রবি.,সোম.,মঙ্গল.,বুধ.,বৃহস্পতি.,শুক্র.,শফি. +জানু.,ফেব্রু.,মার্চ,এপ্রিল,মে,জুন,জুলাই,আগ.,সেপ্টে.,অক্টো.,নভে.,ডিসে., +জানু.,ফেব্রু.,মার্চ,এপ্রিল,মে,জুন,জুলাই,আগ.,সেপ্টে.,অক্টো.,নভে.,ডিসে., +পুর্বাহ্ফ +0 +- +রবিবার,সোমবার,মঙ্গলবার,বুধবার,বৃহস্পতিবার,শুক্রবার,শফিবার +1 +dd MMMM yyyy HH.mm.ss +dd MMMM yyyy +HH.mm.ss +MMMM dd +জানুয়ারী,ফেব্রুয়ারী,মার্চ,এপ্রিল,মে,জুন,জুলাই,আগস্ট,সেপ্টেম্বর,অক্টোবর,নভেম্বর,ডিসেম্বর, +জানুয়ারী,ফেব্রুয়ারী,মার্চ,এপ্রিল,মে,জুন,জুলাই,আগস্ট,সেপ্টেম্বর,অক্টোবর,নভেম্বর,ডিসেম্বর, +ইঙ্গ্রজী ক্য়ালেণ্ডর +HH.mm.ss +অপরাহ্ফ +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yy +রবি.,সোম.,মঙ্গল.,বুধ.,বৃহস্পতি.,শুক্র.,শফি. +HH.mm.ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +. +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/bs-Latn-BA b/dna/Cultures/bs-Latn-BA new file mode 100644 index 0000000..8663eb0 --- /dev/null +++ b/dna/Cultures/bs-Latn-BA @@ -0,0 +1,72 @@ +bs-Latn-BA +0x141a + +Bosnian (Bosnia and Herzegovina) +bosanski (Bosna i Hercegovina) +Bosnian (Latin, Bosnia and Herzegovina) +bs +bs +BSB +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +bs-Latn-BA +False +1250 +870 +False +; +10082 +852 +2 +, +. +3 +8 +3 +KM +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinity ++ +ned,pon,uto,sri,čet,pet,sub +jan,feb,mar,apr,maj,jun,jul,avg,sep,okt,nov,dec, +jan,feb,mar,apr,maj,jun,jul,avg,sep,okt,nov,dec, + +0 +. +nedjelja,ponedjeljak,utorak,srijeda,četvrtak,petak,subota +1 +d. MMMM yyyy H:mm:ss +d. MMMM yyyy +H:mm:ss +MMMM dd +januar,februar,mart,april,maj,jun,jul,avgust,septembar,oktobar,novembar,decembar, +januar,februar,mart,april,maj,jun,jul,avgust,septembar,oktobar,novembar,decembar, +gregorijanski kalendar +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.M.yyyy +ned,pon,uto,sri,čet,pet,sub +H:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/ca b/dna/Cultures/ca new file mode 100644 index 0000000..71a2921 --- /dev/null +++ b/dna/Cultures/ca @@ -0,0 +1,20 @@ +ca +0x0003 + +Catalan +català +Catalan +ca +cat +CAT +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +ca +True +1252 +500 +False +; +10000 +850 diff --git a/dna/Cultures/ca-ES b/dna/Cultures/ca-ES new file mode 100644 index 0000000..5475d8d --- /dev/null +++ b/dna/Cultures/ca-ES @@ -0,0 +1,72 @@ +ca-ES +0x0403 +ca +Catalan (Catalan) +català (català) +Catalan (Catalan) +ca +cat +CAT +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +ca-ES +False +1252 +500 +False +; +10000 +850 +2 +, +. +3 +8 +3 +€ +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinit +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinit ++ +dg.,dl.,dt.,dc.,dj.,dv.,ds. +gen,feb,març,abr,maig,juny,jul,ag,set,oct,nov,des, +gen,feb,març,abr,maig,juny,jul,ag,set,oct,nov,des, + +0 +/ +diumenge,dilluns,dimarts,dimecres,dijous,divendres,dissabte +1 +dddd, d' / 'MMMM' / 'yyyy HH:mm:ss +dddd, d' / 'MMMM' / 'yyyy +HH:mm:ss +dd MMMM +gener,febrer,març,abril,maig,juny,juliol,agost,setembre,octubre,novembre,desembre, +gener,febrer,març,abril,maig,juny,juliol,agost,setembre,octubre,novembre,desembre, +calendari gregorià +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +dg,dl,dt,dc,dj,dv,ds +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' / 'yyyy diff --git a/dna/Cultures/cs b/dna/Cultures/cs new file mode 100644 index 0000000..8154d16 --- /dev/null +++ b/dna/Cultures/cs @@ -0,0 +1,20 @@ +cs +0x0005 + +Czech +čeština +Czech +cs +ces +CSY +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +cs +True +1250 +500 +False +; +10029 +852 diff --git a/dna/Cultures/cs-CZ b/dna/Cultures/cs-CZ new file mode 100644 index 0000000..ec2e68e --- /dev/null +++ b/dna/Cultures/cs-CZ @@ -0,0 +1,72 @@ +cs-CZ +0x0405 +cs +Czech (Czech Republic) +čeština (Česká republika) +Czech (Czech Republic) +cs +ces +CSY +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +cs-CZ +False +1250 +500 +False +; +10029 +852 +2 +, +  +3 +8 +3 +Kč +1 +Není číslo +0,1,2,3,4,5,6,7,8,9 +-nekonečno +- +2 +, +  +3 +1 +2 +, +  +3 +1 +1 +% +‰ ++nekonečno ++ +ne,po,út,st,čt,pá,so +I,II,III,IV,V,VI,VII,VIII,IX,X,XI,XII, +I,II,III,IV,V,VI,VII,VIII,IX,X,XI,XII, +dop. +0 +. +neděle,pondělí,úterý,středa,čtvrtek,pátek,sobota +1 +d. MMMM yyyy H:mm:ss +d. MMMM yyyy +H:mm:ss +dd MMMM +ledna,února,března,dubna,května,června,července,srpna,září,října,listopadu,prosince, +leden,únor,březen,duben,květen,červen,červenec,srpen,září,říjen,listopad,prosinec, +gregoriánský kalendář +H:mm:ss +odp. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.M.yyyy +ne,po,út,st,čt,pá,so +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/cy-GB b/dna/Cultures/cy-GB new file mode 100644 index 0000000..2d52fc3 --- /dev/null +++ b/dna/Cultures/cy-GB @@ -0,0 +1,72 @@ +cy-GB +0x0452 + +Welsh (United Kingdom) +Cymraeg (y Deyrnas Unedig) +Welsh +cy +cy +CYM +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +cy-GB +False +1252 +20285 +False +, +10000 +850 +2 +. +, +3 +1 +0 +£ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sul,Llun,Maw,Mer,Iau,Gwe,Sad +Ion,Chwe,Maw,Ebr,Mai,Meh,Gor,Aws,Med,Hyd,Tach,Rhag, +Ion,Chwe,Maw,Ebr,Mai,Meh,Gor,Aws,Med,Hyd,Tach,Rhag, +a.m. +0 +/ +Dydd Sul,Dydd Llun,Dydd Mawrth,Dydd Mercher,Dydd Iau,Dydd Gwener,Dydd Sadwrn +1 +dd MMMM yyyy HH:mm:ss +dd MMMM yyyy +HH:mm:ss +MMMM dd +Ionawr,Chwefror,Mawrth,Ebrill,Mai,Mehefin,Gorffennaf,Awst,Medi,Hydref,Tachwedd,Rhagfyr, +Ionawr,Chwefror,Mawrth,Ebrill,Mai,Mehefin,Gorffennaf,Awst,Medi,Hydref,Tachwedd,Rhagfyr, +calendr Gregori +HH:mm:ss +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +Sul,Llun,Maw,Mer,Iau,Gwe,Sad +HH:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/da b/dna/Cultures/da new file mode 100644 index 0000000..73562c6 --- /dev/null +++ b/dna/Cultures/da @@ -0,0 +1,20 @@ +da +0x0006 + +Danish +dansk +Danish +da +dan +DAN +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +da +True +1252 +20277 +False +; +10000 +850 diff --git a/dna/Cultures/da-DK b/dna/Cultures/da-DK new file mode 100644 index 0000000..b699ecd --- /dev/null +++ b/dna/Cultures/da-DK @@ -0,0 +1,72 @@ +da-DK +0x0406 +da +Danish (Denmark) +dansk (Danmark) +Danish (Denmark) +da +dan +DAN +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +da-DK +False +1252 +20277 +False +; +10000 +850 +2 +, +. +3 +12 +2 +kr +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-INF +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +INF ++ +sø,ma,ti,on,to,fr,lø +jan,feb,mar,apr,maj,jun,jul,aug,sep,okt,nov,dec, +jan,feb,mar,apr,maj,jun,jul,aug,sep,okt,nov,dec, + +2 +- +søndag,mandag,tirsdag,onsdag,torsdag,fredag,lørdag +1 +d. MMMM yyyy HH:mm:ss +d. MMMM yyyy +HH:mm:ss +d. MMMM +januar,februar,marts,april,maj,juni,juli,august,september,oktober,november,december, +januar,februar,marts,april,maj,juni,juli,august,september,oktober,november,december, +Den gregorianske kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yyyy +sø,ma,ti,on,to,fr,lø +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/de b/dna/Cultures/de new file mode 100644 index 0000000..943b83c --- /dev/null +++ b/dna/Cultures/de @@ -0,0 +1,20 @@ +de +0x0007 + +German +Deutsch +German +de +deu +DEU +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +de +True +1252 +20273 +False +; +10000 +850 diff --git a/dna/Cultures/de-AT b/dna/Cultures/de-AT new file mode 100644 index 0000000..4745d63 --- /dev/null +++ b/dna/Cultures/de-AT @@ -0,0 +1,72 @@ +de-AT +0x0c07 +de +German (Austria) +Deutsch (Österreich) +German (Austria) +de +deu +DEA +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +de-AT +False +1252 +20273 +False +; +10000 +850 +2 +, +. +3 +9 +2 +€ +1 +n. def. +0,1,2,3,4,5,6,7,8,9 +-unendlich +- +2 +, +. +3 +1 +2 +, +. +3 +1 +1 +% +‰ ++unendlich ++ +So,Mo,Di,Mi,Do,Fr,Sa +Jän,Feb,Mär,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez, +Jän,Feb,Mär,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez, + +0 +. +Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag +1 +dddd, dd. MMMM yyyy HH:mm:ss +dddd, dd. MMMM yyyy +HH:mm:ss +dd MMMM +Jänner,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember, +Jänner,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember, +Gregorianischer Kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +So,Mo,Di,Mi,Do,Fr,Sa +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/de-CH b/dna/Cultures/de-CH new file mode 100644 index 0000000..a4ba99d --- /dev/null +++ b/dna/Cultures/de-CH @@ -0,0 +1,72 @@ +de-CH +0x0807 +de +German (Switzerland) +Deutsch (Schweiz) +German (Switzerland) +de +deu +DES +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +de-CH +False +1252 +20273 +False +; +10000 +850 +2 +. +' +3 +2 +2 +SFr. +1 +n. def. +0,1,2,3,4,5,6,7,8,9 +-unendlich +- +2 +. +' +3 +1 +2 +. +' +3 +1 +1 +% +‰ ++unendlich ++ +So,Mo,Di,Mi,Do,Fr,Sa +Jan,Feb,Mrz,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez, +Jan,Feb,Mrz,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez, + +2 +. +Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag +1 +dddd, d. MMMM yyyy HH:mm:ss +dddd, d. MMMM yyyy +HH:mm:ss +dd MMMM +Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember, +Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember, +Gregorianischer Kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +So,Mo,Di,Mi,Do,Fr,Sa +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/de-DE b/dna/Cultures/de-DE new file mode 100644 index 0000000..4d0efc6 --- /dev/null +++ b/dna/Cultures/de-DE @@ -0,0 +1,72 @@ +de-DE +0x0407 +de +German (Germany) +Deutsch (Deutschland) +German (Germany) +de +deu +DEU +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +de-DE +False +1252 +20273 +False +; +10000 +850 +2 +, +. +3 +8 +3 +€ +1 +n. def. +0,1,2,3,4,5,6,7,8,9 +-unendlich +- +2 +, +. +3 +1 +2 +, +. +3 +1 +1 +% +‰ ++unendlich ++ +So,Mo,Di,Mi,Do,Fr,Sa +Jan,Feb,Mrz,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez, +Jan,Feb,Mrz,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez, + +2 +. +Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag +1 +dddd, d. MMMM yyyy HH:mm:ss +dddd, d. MMMM yyyy +HH:mm:ss +dd MMMM +Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember, +Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember, +Gregorianischer Kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +So,Mo,Di,Mi,Do,Fr,Sa +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/de-LI b/dna/Cultures/de-LI new file mode 100644 index 0000000..ff69819 --- /dev/null +++ b/dna/Cultures/de-LI @@ -0,0 +1,72 @@ +de-LI +0x1407 +de +German (Liechtenstein) +Deutsch (Liechtenstein) +German (Liechtenstein) +de +deu +DEC +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +de-LI +False +1252 +20273 +False +; +10000 +850 +2 +. +' +3 +2 +2 +CHF +1 +n. def. +0,1,2,3,4,5,6,7,8,9 +-unendlich +- +2 +. +' +3 +1 +2 +. +' +3 +1 +1 +% +‰ ++unendlich ++ +So,Mo,Di,Mi,Do,Fr,Sa +Jan,Feb,Mrz,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez, +Jan,Feb,Mrz,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez, + +2 +. +Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag +1 +dddd, d. MMMM yyyy HH:mm:ss +dddd, d. MMMM yyyy +HH:mm:ss +dd MMMM +Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember, +Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember, +Gregorianischer Kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +So,Mo,Di,Mi,Do,Fr,Sa +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/de-LU b/dna/Cultures/de-LU new file mode 100644 index 0000000..d5fc5e1 --- /dev/null +++ b/dna/Cultures/de-LU @@ -0,0 +1,72 @@ +de-LU +0x1007 +de +German (Luxembourg) +Deutsch (Luxemburg) +German (Luxembourg) +de +deu +DEL +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +de-LU +False +1252 +20273 +False +; +10000 +850 +2 +, +. +3 +8 +3 +€ +1 +n. def. +0,1,2,3,4,5,6,7,8,9 +-unendlich +- +2 +, +. +3 +1 +2 +, +. +3 +1 +1 +% +‰ ++unendlich ++ +So,Mo,Di,Mi,Do,Fr,Sa +Jan,Feb,Mrz,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez, +Jan,Feb,Mrz,Apr,Mai,Jun,Jul,Aug,Sep,Okt,Nov,Dez, + +2 +. +Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag +1 +dddd, d. MMMM yyyy HH:mm:ss +dddd, d. MMMM yyyy +HH:mm:ss +dd MMMM +Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember, +Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember, +Gregorianischer Kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +So,Mo,Di,Mi,Do,Fr,Sa +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/dv b/dna/Cultures/dv new file mode 100644 index 0000000..5308718 --- /dev/null +++ b/dna/Cultures/dv @@ -0,0 +1,20 @@ +dv +0x0065 + +Divehi +ދިވެހިބަސް +Divehi +dv +div +DIV +HijriCalendar +HijriCalendar,GregorianCalendar:Localized +65 +dv +True +0 +500 +True +، +2 +1 diff --git a/dna/Cultures/dv-MV b/dna/Cultures/dv-MV new file mode 100644 index 0000000..b6991be --- /dev/null +++ b/dna/Cultures/dv-MV @@ -0,0 +1,72 @@ +dv-MV +0x0465 +dv +Divehi (Maldives) +ދިވެހިބަސް (ދިވެހި ރާއްޖެ) +Divehi (Maldives) +dv +div +DIV +HijriCalendar +HijriCalendar,GregorianCalendar:Localized +70 +dv-MV +False +0 +500 +True +، +2 +1 +2 +. +, +3 +10 +3 +ރ. +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +محرم,صفر,ربيع الاول,ربيع الثاني,جمادى الاولى,جمادى الثانية,رجب,شعبان,رمضان,شوال,ذو القعدة,ذو الحجة, +محرم,صفر,ربيع الاول,ربيع الثاني,جمادى الاولى,جمادى الثانية,رجب,شعبان,رمضان,شوال,ذو القعدة,ذو الحجة, +މކ +0 +/ +الاحد,الاثنين,الثلاثاء,الاربعاء,الخميس,الجمعة,السبت +0 +dd/MMMM/yyyy HH:mm:ss +dd/MMMM/yyyy +HH:mm:ss +dd MMMM +محرم,صفر,ربيع الأول,ربيع الثاني,جمادى الأولى,جمادى الثانية,رجب,شعبان,رمضان,شوال,ذو القعدة,ذو الحجة, +محرم,صفر,ربيع الأول,ربيع الثاني,جمادى الأولى,جمادى الثانية,رجب,شعبان,رمضان,شوال,ذو القعدة,ذو الحجة, +ހިޖްރީ ކަލަންޑަރު +HH:mm:ss +މފ +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yy +ح,ن,ث,ر,خ,ج,س +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/el b/dna/Cultures/el new file mode 100644 index 0000000..6888294 --- /dev/null +++ b/dna/Cultures/el @@ -0,0 +1,20 @@ +el +0x0008 + +Greek +ελληνικά +Greek +el +ell +ELL +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +el +True +1253 +20273 +False +; +10006 +737 diff --git a/dna/Cultures/el-GR b/dna/Cultures/el-GR new file mode 100644 index 0000000..4fe6547 --- /dev/null +++ b/dna/Cultures/el-GR @@ -0,0 +1,72 @@ +el-GR +0x0408 +el +Greek (Greece) +ελληνικά (Ελλάδα) +Greek (Greece) +el +ell +ELL +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +el-GR +False +1253 +20273 +False +; +10006 +737 +2 +, +. +3 +8 +3 +€ +1 +μη αριθμός +0,1,2,3,4,5,6,7,8,9 +-Άπειρο +- +2 +, +. +3 +1 +2 +, +. +3 +1 +1 +% +‰ +Άπειρο ++ +Κυρ,Δευ,Τρι,Τετ,Πεμ,Παρ,Σαβ +Ιαν,Φεβ,Μαρ,Απρ,Μαϊ,Ιουν,Ιουλ,Αυγ,Σεπ,Οκτ,Νοε,Δεκ, +Ιαν,Φεβ,Μαρ,Απρ,Μαϊ,Ιουν,Ιουλ,Αυγ,Σεπ,Οκτ,Νοε,Δεκ, +πμ +0 +/ +Κυριακή,Δευτέρα,Τρίτη,Τετάρτη,Πέμπτη,Παρασκευή,Σάββατο +1 +dddd, d MMMM yyyy h:mm:ss tt +dddd, d MMMM yyyy +h:mm:ss tt +dd MMMM +Ιανουαρίου,Φεβρουαρίου,Μαρτίου,Απριλίου,Μαΐου,Ιουνίου,Ιουλίου,Αυγούστου,Σεπτεμβρίου,Οκτωβρίου,Νοεμβρίου,Δεκεμβρίου, +Ιανουάριος,Φεβρουάριος,Μάρτιος,Απρίλιος,Μάιος,Ιούνιος,Ιούλιος,Αύγουστος,Σεπτέμβριος,Οκτώβριος,Νοέμβριος,Δεκέμβριος, +Γρηγοριανό Ημερολόγιο +h:mm:ss tt +μμ +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d/M/yyyy +Κυ,Δε,Τρ,Τε,Πε,Πα,Σά +h:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/en b/dna/Cultures/en new file mode 100644 index 0000000..21160ce --- /dev/null +++ b/dna/Cultures/en @@ -0,0 +1,20 @@ +en +0x0009 + +English +English +English +en +eng +ENU +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish +65 +en +True +1252 +37 +False +, +10000 +437 diff --git a/dna/Cultures/en-029 b/dna/Cultures/en-029 new file mode 100644 index 0000000..6c92e9f --- /dev/null +++ b/dna/Cultures/en-029 @@ -0,0 +1,72 @@ +en-029 +0x2409 +en +English (Caribbean) +English (Caribbean) +English (Caribbean) +en +eng +ENB +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish +70 +en-029 +False +1252 +500 +False +, +10000 +850 +2 +. +, +3 +1 +0 +$ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +1 +dddd, MMMM dd, yyyy h:mm:ss tt +dddd, MMMM dd, yyyy +h:mm:ss tt +MMMM dd +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar +h:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +MM/dd/yyyy +Su,Mo,Tu,We,Th,Fr,Sa +h:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/en-AU b/dna/Cultures/en-AU new file mode 100644 index 0000000..27fbed5 --- /dev/null +++ b/dna/Cultures/en-AU @@ -0,0 +1,72 @@ +en-AU +0x0c09 +en +English (Australia) +English (Australia) +English (Australia) +en +eng +ENA +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish +70 +en-AU +False +1252 +500 +False +, +10000 +850 +2 +. +, +3 +1 +0 +$ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +1 +dddd, d MMMM yyyy h:mm:ss tt +dddd, d MMMM yyyy +h:mm:ss tt +dd MMMM +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar +h:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d/MM/yyyy +Su,Mo,Tu,We,Th,Fr,Sa +h:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/en-BZ b/dna/Cultures/en-BZ new file mode 100644 index 0000000..d6e1b6a --- /dev/null +++ b/dna/Cultures/en-BZ @@ -0,0 +1,72 @@ +en-BZ +0x2809 +en +English (Belize) +English (Belize) +English (Belize) +en +eng +ENL +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish +70 +en-BZ +False +1252 +500 +False +; +10000 +850 +2 +. +, +3,0 +0 +0 +BZ$ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +0 +dddd, dd MMMM yyyy hh:mm:ss tt +dddd, dd MMMM yyyy +hh:mm:ss tt +dd MMMM +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar +hh:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +Su,Mo,Tu,We,Th,Fr,Sa +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/en-CA b/dna/Cultures/en-CA new file mode 100644 index 0000000..05661ab --- /dev/null +++ b/dna/Cultures/en-CA @@ -0,0 +1,72 @@ +en-CA +0x1009 +en +English (Canada) +English (Canada) +English (Canada) +en +eng +ENC +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish +70 +en-CA +False +1252 +37 +False +, +10000 +850 +2 +. +, +3 +1 +0 +$ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +0 +MMMM d, yyyy h:mm:ss tt +MMMM d, yyyy +h:mm:ss tt +MMMM dd +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar +h:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +Su,Mo,Tu,We,Th,Fr,Sa +h:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/en-GB b/dna/Cultures/en-GB new file mode 100644 index 0000000..e1364cc --- /dev/null +++ b/dna/Cultures/en-GB @@ -0,0 +1,72 @@ +en-GB +0x0809 +en +English (United Kingdom) +English (United Kingdom) +English (United Kingdom) +en +eng +ENG +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish +70 +en-GB +False +1252 +20285 +False +, +10000 +850 +2 +. +, +3 +1 +0 +£ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +1 +dd MMMM yyyy HH:mm:ss +dd MMMM yyyy +HH:mm:ss +dd MMMM +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar +HH:mm:ss +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +Su,Mo,Tu,We,Th,Fr,Sa +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/en-IE b/dna/Cultures/en-IE new file mode 100644 index 0000000..08e43fb --- /dev/null +++ b/dna/Cultures/en-IE @@ -0,0 +1,72 @@ +en-IE +0x1809 +en +English (Ireland) +English (Eire) +English (Ireland) +en +eng +ENI +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish +70 +en-IE +False +1252 +500 +False +, +10000 +850 +2 +. +, +3 +1 +0 +€ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, + +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +1 +dd MMMM yyyy HH:mm:ss +dd MMMM yyyy +HH:mm:ss +dd MMMM +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +Su,Mo,Tu,We,Th,Fr,Sa +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/en-JM b/dna/Cultures/en-JM new file mode 100644 index 0000000..adfd281 --- /dev/null +++ b/dna/Cultures/en-JM @@ -0,0 +1,72 @@ +en-JM +0x2009 +en +English (Jamaica) +English (Jamaica) +English (Jamaica) +en +eng +ENJ +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish +70 +en-JM +False +1252 +500 +False +, +10000 +850 +2 +. +, +3 +1 +0 +J$ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +0 +dddd, MMMM dd, yyyy hh:mm:ss tt +dddd, MMMM dd, yyyy +hh:mm:ss tt +MMMM dd +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar +hh:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +Su,Mo,Tu,We,Th,Fr,Sa +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/en-NZ b/dna/Cultures/en-NZ new file mode 100644 index 0000000..19c443e --- /dev/null +++ b/dna/Cultures/en-NZ @@ -0,0 +1,72 @@ +en-NZ +0x1409 +en +English (New Zealand) +English (New Zealand) +English (New Zealand) +en +eng +ENZ +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish +70 +en-NZ +False +1252 +500 +False +, +10000 +850 +2 +. +, +3 +1 +0 +$ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +a.m. +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +1 +dddd, d MMMM yyyy h:mm:ss tt +dddd, d MMMM yyyy +h:mm:ss tt +dd MMMM +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar +h:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d/MM/yyyy +Su,Mo,Tu,We,Th,Fr,Sa +h:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/en-PH b/dna/Cultures/en-PH new file mode 100644 index 0000000..8c124e7 --- /dev/null +++ b/dna/Cultures/en-PH @@ -0,0 +1,72 @@ +en-PH +0x3409 +en +English (Republic of the Philippines) +English (Philippines) +English (Republic of the Philippines) +en +eng +ENP +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish +70 +en-PH +False +1252 +500 +False +, +10000 +437 +2 +. +, +3 +0 +0 +Php +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +0 +dddd, MMMM dd, yyyy h:mm:ss tt +dddd, MMMM dd, yyyy +h:mm:ss tt +MMMM dd +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar +h:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +M/d/yyyy +Su,Mo,Tu,We,Th,Fr,Sa +h:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/en-TT b/dna/Cultures/en-TT new file mode 100644 index 0000000..290102d --- /dev/null +++ b/dna/Cultures/en-TT @@ -0,0 +1,72 @@ +en-TT +0x2c09 +en +English (Trinidad and Tobago) +English (Trinidad y Tobago) +English (Trinidad and Tobago) +en +eng +ENT +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish +70 +en-TT +False +1252 +500 +False +; +10000 +850 +2 +. +, +3,0 +0 +0 +TT$ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +0 +dddd, dd MMMM yyyy hh:mm:ss tt +dddd, dd MMMM yyyy +hh:mm:ss tt +dd MMMM +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar +hh:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +Su,Mo,Tu,We,Th,Fr,Sa +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/en-US b/dna/Cultures/en-US new file mode 100644 index 0000000..461b707 --- /dev/null +++ b/dna/Cultures/en-US @@ -0,0 +1,72 @@ +en-US +0x0409 +en +English (United States) +English (United States) +English (United States) +en +eng +ENU +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish +70 +en-US +False +1252 +37 +False +, +10000 +437 +2 +. +, +3 +0 +0 +$ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +0 +dddd, MMMM dd, yyyy h:mm:ss tt +dddd, MMMM dd, yyyy +h:mm:ss tt +MMMM dd +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar +h:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +M/d/yyyy +Su,Mo,Tu,We,Th,Fr,Sa +h:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/en-ZA b/dna/Cultures/en-ZA new file mode 100644 index 0000000..583e0ee --- /dev/null +++ b/dna/Cultures/en-ZA @@ -0,0 +1,72 @@ +en-ZA +0x1c09 +en +English (South Africa) +English (South Africa) +English (South Africa) +en +eng +ENS +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish +70 +en-ZA +False +1252 +500 +False +, +10000 +437 +2 +. +, +3 +2 +2 +R +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +1 +1 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +0 +dd MMMM yyyy hh:mm:ss tt +dd MMMM yyyy +hh:mm:ss tt +dd MMMM +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar +hh:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy/MM/dd +Su,Mo,Tu,We,Th,Fr,Sa +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/en-ZW b/dna/Cultures/en-ZW new file mode 100644 index 0000000..e040131 --- /dev/null +++ b/dna/Cultures/en-ZW @@ -0,0 +1,72 @@ +en-ZW +0x3009 +en +English (Zimbabwe) +English (Zimbabwe) +English (Zimbabwe) +en +eng +ENW +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish +70 +en-ZW +False +1252 +500 +False +, +10000 +437 +2 +. +, +3 +0 +0 +Z$ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +0 +dddd, MMMM dd, yyyy h:mm:ss tt +dddd, MMMM dd, yyyy +h:mm:ss tt +MMMM dd +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar +h:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +M/d/yyyy +Su,Mo,Tu,We,Th,Fr,Sa +h:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/es b/dna/Cultures/es new file mode 100644 index 0000000..f24bae4 --- /dev/null +++ b/dna/Cultures/es @@ -0,0 +1,20 @@ +es +0x000a + +Spanish +español +Spanish +es +spa +ESP +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +es +True +1252 +20284 +False +; +10000 +850 diff --git a/dna/Cultures/es-AR b/dna/Cultures/es-AR new file mode 100644 index 0000000..e307468 --- /dev/null +++ b/dna/Cultures/es-AR @@ -0,0 +1,72 @@ +es-AR +0x2c0a +es +Spanish (Argentina) +Español (Argentina) +Spanish (Argentina) +es +spa +ESS +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-AR +False +1252 +20284 +False +, +10000 +850 +2 +, +. +3 +2 +2 +$ +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-BO b/dna/Cultures/es-BO new file mode 100644 index 0000000..2993c05 --- /dev/null +++ b/dna/Cultures/es-BO @@ -0,0 +1,72 @@ +es-BO +0x400a +es +Spanish (Bolivia) +Español (Bolivia) +Spanish (Bolivia) +es +spa +ESB +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-BO +False +1252 +20284 +False +, +10000 +850 +2 +, +. +3 +14 +2 +$b +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-CL b/dna/Cultures/es-CL new file mode 100644 index 0000000..d6de6db --- /dev/null +++ b/dna/Cultures/es-CL @@ -0,0 +1,72 @@ +es-CL +0x340a +es +Spanish (Chile) +Español (Chile) +Spanish (Chile) +es +spa +ESL +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-CL +False +1252 +20284 +False +, +10000 +850 +2 +, +. +3 +9 +2 +$ +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, + +0 +- +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy H:mm:ss +dddd, dd' de 'MMMM' de 'yyyy +H:mm:ss +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yyyy +do,lu,ma,mi,ju,vi,sá +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-CO b/dna/Cultures/es-CO new file mode 100644 index 0000000..13c21c6 --- /dev/null +++ b/dna/Cultures/es-CO @@ -0,0 +1,72 @@ +es-CO +0x240a +es +Spanish (Colombia) +Español (Colombia) +Spanish (Colombia) +es +spa +ESO +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-CO +False +1252 +20284 +False +, +10000 +850 +2 +, +. +3 +14 +2 +$ +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-CR b/dna/Cultures/es-CR new file mode 100644 index 0000000..0ff2485 --- /dev/null +++ b/dna/Cultures/es-CR @@ -0,0 +1,72 @@ +es-CR +0x140a +es +Spanish (Costa Rica) +Español (Costa Rica) +Spanish (Costa Rica) +es +spa +ESC +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-CR +False +1252 +20284 +False +, +10000 +850 +2 +, +. +3 +0 +0 +₡ +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-DO b/dna/Cultures/es-DO new file mode 100644 index 0000000..154ae90 --- /dev/null +++ b/dna/Cultures/es-DO @@ -0,0 +1,72 @@ +es-DO +0x1c0a +es +Spanish (Dominican Republic) +Español (República Dominicana) +Spanish (Dominican Republic) +es +spa +ESD +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-DO +False +1252 +20284 +False +, +10000 +850 +2 +. +, +3 +0 +0 +RD$ +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-EC b/dna/Cultures/es-EC new file mode 100644 index 0000000..5e767cd --- /dev/null +++ b/dna/Cultures/es-EC @@ -0,0 +1,72 @@ +es-EC +0x300a +es +Spanish (Ecuador) +Español (Ecuador) +Spanish (Ecuador) +es +spa +ESF +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-EC +False +1252 +20284 +False +, +10000 +850 +2 +, +. +3 +14 +2 +$ +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, + +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy H:mm:ss +dddd, dd' de 'MMMM' de 'yyyy +H:mm:ss +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-ES b/dna/Cultures/es-ES new file mode 100644 index 0000000..58ffca5 --- /dev/null +++ b/dna/Cultures/es-ES @@ -0,0 +1,72 @@ +es-ES +0x0c0a +es +Spanish (Spain) +español (España) +Spanish (Spain) +es +spa +ESN +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-ES +False +1252 +20284 +False +; +10000 +850 +2 +, +. +3 +8 +3 +€ +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, + +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +1 +dddd, dd' de 'MMMM' de 'yyyy H:mm:ss +dddd, dd' de 'MMMM' de 'yyyy +H:mm:ss +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-GT b/dna/Cultures/es-GT new file mode 100644 index 0000000..9c7e942 --- /dev/null +++ b/dna/Cultures/es-GT @@ -0,0 +1,72 @@ +es-GT +0x100a +es +Spanish (Guatemala) +Español (Guatemala) +Spanish (Guatemala) +es +spa +ESG +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-GT +False +1252 +20284 +False +, +10000 +850 +2 +. +, +3 +0 +0 +Q +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-HN b/dna/Cultures/es-HN new file mode 100644 index 0000000..c431d9f --- /dev/null +++ b/dna/Cultures/es-HN @@ -0,0 +1,72 @@ +es-HN +0x480a +es +Spanish (Honduras) +Español (Honduras) +Spanish (Honduras) +es +spa +ESH +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-HN +False +1252 +20284 +False +, +10000 +850 +2 +. +, +3,0 +12 +2 +L. +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-MX b/dna/Cultures/es-MX new file mode 100644 index 0000000..d474f29 --- /dev/null +++ b/dna/Cultures/es-MX @@ -0,0 +1,72 @@ +es-MX +0x080a +es +Spanish (Mexico) +Español (México) +Spanish (Mexico) +es +spa +ESM +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-MX +False +1252 +20284 +False +, +10000 +850 +2 +. +, +3 +1 +0 +$ +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-NI b/dna/Cultures/es-NI new file mode 100644 index 0000000..91ca894 --- /dev/null +++ b/dna/Cultures/es-NI @@ -0,0 +1,72 @@ +es-NI +0x4c0a +es +Spanish (Nicaragua) +Español (Nicaragua) +Spanish (Nicaragua) +es +spa +ESI +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-NI +False +1252 +20284 +False +, +10000 +850 +2 +. +, +3,0 +14 +2 +C$ +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-PA b/dna/Cultures/es-PA new file mode 100644 index 0000000..0c19ce5 --- /dev/null +++ b/dna/Cultures/es-PA @@ -0,0 +1,72 @@ +es-PA +0x180a +es +Spanish (Panama) +Español (Panamá) +Spanish (Panama) +es +spa +ESA +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-PA +False +1252 +20284 +False +, +10000 +850 +2 +. +, +3 +14 +2 +B/. +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +MM/dd/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-PE b/dna/Cultures/es-PE new file mode 100644 index 0000000..63fb4ac --- /dev/null +++ b/dna/Cultures/es-PE @@ -0,0 +1,72 @@ +es-PE +0x280a +es +Spanish (Peru) +Español (Perú) +Spanish (Peru) +es +spa +ESR +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-PE +False +1252 +20284 +False +, +10000 +850 +2 +. +, +3 +12 +2 +S/. +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-PR b/dna/Cultures/es-PR new file mode 100644 index 0000000..60237ea --- /dev/null +++ b/dna/Cultures/es-PR @@ -0,0 +1,72 @@ +es-PR +0x500a +es +Spanish (Puerto Rico) +Español (Puerto Rico) +Spanish (Puerto Rico) +es +spa +ESU +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-PR +False +1252 +20284 +False +, +10000 +850 +2 +. +, +3,0 +14 +2 +$ +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-PY b/dna/Cultures/es-PY new file mode 100644 index 0000000..ccbd645 --- /dev/null +++ b/dna/Cultures/es-PY @@ -0,0 +1,72 @@ +es-PY +0x3c0a +es +Spanish (Paraguay) +Español (Paraguay) +Spanish (Paraguay) +es +spa +ESZ +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-PY +False +1252 +20284 +False +, +10000 +850 +2 +, +. +3 +14 +2 +Gs +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +1 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-SV b/dna/Cultures/es-SV new file mode 100644 index 0000000..884f875 --- /dev/null +++ b/dna/Cultures/es-SV @@ -0,0 +1,72 @@ +es-SV +0x440a +es +Spanish (El Salvador) +Español (El Salvador) +Spanish (El Salvador) +es +spa +ESE +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-SV +False +1252 +20284 +False +, +10000 +850 +2 +. +, +3,0 +0 +0 +$ +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-UY b/dna/Cultures/es-UY new file mode 100644 index 0000000..08eab10 --- /dev/null +++ b/dna/Cultures/es-UY @@ -0,0 +1,72 @@ +es-UY +0x380a +es +Spanish (Uruguay) +Español (Uruguay) +Spanish (Uruguay) +es +spa +ESY +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-UY +False +1252 +20284 +False +, +10000 +850 +2 +, +. +3 +14 +2 +$U +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +1 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/es-VE b/dna/Cultures/es-VE new file mode 100644 index 0000000..85922b0 --- /dev/null +++ b/dna/Cultures/es-VE @@ -0,0 +1,72 @@ +es-VE +0x200a +es +Spanish (Venezuela) +Español (Republica Bolivariana de Venezuela) +Spanish (Venezuela) +es +spa +ESV +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +es-VE +False +1252 +20284 +False +, +10000 +850 +2 +, +. +3 +12 +2 +Bs +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinito ++ +dom,lun,mar,mié,jue,vie,sáb +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic, +a.m. +0 +/ +domingo,lunes,martes,miércoles,jueves,viernes,sábado +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +dd MMMM +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +enero,febrero,marzo,abril,mayo,junio,julio,agosto,septiembre,octubre,noviembre,diciembre, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,mi,ju,vi,sá +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/et b/dna/Cultures/et new file mode 100644 index 0000000..1e2ccda --- /dev/null +++ b/dna/Cultures/et @@ -0,0 +1,20 @@ +et +0x0025 + +Estonian +eesti +Estonian +et +est +ETI +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +et +True +1257 +500 +False +; +10029 +775 diff --git a/dna/Cultures/et-EE b/dna/Cultures/et-EE new file mode 100644 index 0000000..4f02d69 --- /dev/null +++ b/dna/Cultures/et-EE @@ -0,0 +1,72 @@ +et-EE +0x0425 +et +Estonian (Estonia) +eesti (Eesti) +Estonian (Estonia) +et +est +ETI +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +et-EE +False +1257 +500 +False +; +10029 +775 +2 +. +  +3 +8 +3 +kr +1 +avaldamatu +0,1,2,3,4,5,6,7,8,9 +miinuslõpmatus +- +2 +, +  +3 +1 +2 +, +  +3 +1 +1 +% +‰ +plusslõpmatus ++ +P,E,T,K,N,R,L +jaan,veebr,märts,apr,mai,juuni,juuli,aug,sept,okt,nov,dets, +jaan,veebr,märts,apr,mai,juuni,juuli,aug,sept,okt,nov,dets, +EL +2 +. +pühapäev,esmaspäev,teisipäev,kolmapäev,neljapäev,reede,laupäev +1 +d. MMMM yyyy'. a.' H:mm:ss +d. MMMM yyyy'. a.' +H:mm:ss +d. MMMM +jaanuar,veebruar,märts,aprill,mai,juuni,juuli,august,september,oktoober,november,detsember, +jaanuar,veebruar,märts,aprill,mai,juuni,juuli,august,september,oktoober,november,detsember, +Gregoriuse kalender +H:mm:ss +PL +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.MM.yyyy +P,E,T,K,N,R,L +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy'. a.' diff --git a/dna/Cultures/eu b/dna/Cultures/eu new file mode 100644 index 0000000..dce794c --- /dev/null +++ b/dna/Cultures/eu @@ -0,0 +1,20 @@ +eu +0x002d + +Basque +euskara +Basque +eu +eus +EUQ +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +eu +True +1252 +500 +False +; +10000 +850 diff --git a/dna/Cultures/eu-ES b/dna/Cultures/eu-ES new file mode 100644 index 0000000..5969a45 --- /dev/null +++ b/dna/Cultures/eu-ES @@ -0,0 +1,72 @@ +eu-ES +0x042d +eu +Basque (Basque) +euskara (euskara) +Basque (Basque) +eu +eus +EUQ +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +eu-ES +False +1252 +500 +False +; +10000 +850 +2 +, +. +3 +8 +3 +€ +1 +EdZ +0,1,2,3,4,5,6,7,8,9 +-Infinitu +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinitu ++ +ig.,al.,as.,az.,og.,or.,lr. +urt.,ots.,mar.,api.,mai.,eka.,uzt.,abu.,ira.,urr.,aza.,abe., +urt.,ots.,mar.,api.,mai.,eka.,uzt.,abu.,ira.,urr.,aza.,abe., + +0 +/ +igandea,astelehena,asteartea,asteazkena,osteguna,ostirala,larunbata +1 +dddd, yyyy.'eko' MMMM'k 'd HH:mm:ss +dddd, yyyy.'eko' MMMM'k 'd +HH:mm:ss +MMMM dd +urtarrila,otsaila,martxoa,apirila,maiatza,ekaina,uztaila,abuztua,iraila,urria,azaroa,abendua, +urtarrila,otsaila,martxoa,apirila,maiatza,ekaina,uztaila,abuztua,iraila,urria,azaroa,abendua, +egutegi gregoriotarra +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy/MM/dd +ig,al,as,az,og,or,lr +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +yyyy.'eko' MMMM diff --git a/dna/Cultures/fa b/dna/Cultures/fa new file mode 100644 index 0000000..6316f40 --- /dev/null +++ b/dna/Cultures/fa @@ -0,0 +1,20 @@ +fa +0x0029 + +Persian +فارسى +Persian +fa +fas +FAR +GregorianCalendar:USEnglish +GregorianCalendar:TransliteratedFrench,GregorianCalendar:USEnglish,GregorianCalendar:Localized,HijriCalendar,GregorianCalendar:TransliteratedEnglish +65 +fa +True +1256 +20420 +True +; +10004 +720 diff --git a/dna/Cultures/fa-IR b/dna/Cultures/fa-IR new file mode 100644 index 0000000..a5f422b --- /dev/null +++ b/dna/Cultures/fa-IR @@ -0,0 +1,72 @@ +fa-IR +0x0429 +fa +Persian (Iran) +فارسى (ايران) +Persian (Iran) +fa +fas +FAR +GregorianCalendar:USEnglish +GregorianCalendar:TransliteratedFrench,GregorianCalendar:USEnglish,GregorianCalendar:Localized,HijriCalendar,GregorianCalendar:TransliteratedEnglish +70 +fa-IR +False +1256 +20420 +True +; +10004 +720 +2 +/ +, +3 +3 +2 +ريال +0 +NaN +۰,۱,۲,۳,۴,۵,۶,۷,۸,۹ +-Infinity +- +2 +. +, +3 +3 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +ق.ظ +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +0 +dddd, MMMM dd, yyyy hh:mm:ss tt +dddd, MMMM dd, yyyy +hh:mm:ss tt +MMMM dd +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar (English) +hh:mm:ss tt +ب.ظ +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +M/d/yyyy +Su,Mo,Tu,We,Th,Fr,Sa +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/fi b/dna/Cultures/fi new file mode 100644 index 0000000..0baa2fe --- /dev/null +++ b/dna/Cultures/fi @@ -0,0 +1,20 @@ +fi +0x000b + +Finnish +suomi +Finnish +fi +fin +FIN +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +fi +True +1252 +20278 +False +; +10000 +850 diff --git a/dna/Cultures/fi-FI b/dna/Cultures/fi-FI new file mode 100644 index 0000000..ed27aa5 --- /dev/null +++ b/dna/Cultures/fi-FI @@ -0,0 +1,72 @@ +fi-FI +0x040b +fi +Finnish (Finland) +suomi (Suomi) +Finnish (Finland) +fi +fin +FIN +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +fi-FI +False +1252 +20278 +False +; +10000 +850 +2 +, +  +3 +8 +3 +€ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-INF +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +INF ++ +su,ma,ti,ke,to,pe,la +tammi,helmi,maalis,huhti,touko,kesä,heinä,elo,syys,loka,marras,joulu, +tammi,helmi,maalis,huhti,touko,kesä,heinä,elo,syys,loka,marras,joulu, + +2 +. +sunnuntai,maanantai,tiistai,keskiviikko,torstai,perjantai,lauantai +1 +d. MMMM'ta 'yyyy H:mm:ss +d. MMMM'ta 'yyyy +H:mm:ss +d. MMMM'ta' +tammikuu,helmikuu,maaliskuu,huhtikuu,toukokuu,kesäkuu,heinäkuu,elokuu,syyskuu,lokakuu,marraskuu,joulukuu, +tammikuu,helmikuu,maaliskuu,huhtikuu,toukokuu,kesäkuu,heinäkuu,elokuu,syyskuu,lokakuu,marraskuu,joulukuu, +gregoriaaninen kalenteri +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.M.yyyy +su,ma,ti,ke,to,pe,la +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/fo b/dna/Cultures/fo new file mode 100644 index 0000000..1153c46 --- /dev/null +++ b/dna/Cultures/fo @@ -0,0 +1,20 @@ +fo +0x0038 + +Faroese +føroyskt +Faroese +fo +fao +FOS +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +fo +True +1252 +20277 +False +; +10079 +850 diff --git a/dna/Cultures/fo-FO b/dna/Cultures/fo-FO new file mode 100644 index 0000000..362125c --- /dev/null +++ b/dna/Cultures/fo-FO @@ -0,0 +1,72 @@ +fo-FO +0x0438 +fo +Faroese (Faroe Islands) +føroyskt (Føroyar) +Faroese (Faroe Islands) +fo +fao +FOS +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +fo-FO +False +1252 +20277 +False +; +10079 +850 +2 +, +. +3 +12 +2 +kr +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-INF +- +2 +, +. +3 +1 +2 +, +. +3 +1 +1 +% +‰ +INF ++ +sun,mán,týs,mik,hós,frí,leyg +jan,feb,mar,apr,mai,jun,jul,aug,sep,okt,nov,des, +jan,feb,mar,apr,mai,jun,jul,aug,sep,okt,nov,des, + +2 +- +sunnudagur,mánadagur,týsdagur,mikudagur,hósdagur,fríggjadagur,leygardagur +1 +d. MMMM yyyy HH.mm.ss +d. MMMM yyyy +HH.mm.ss +d. MMMM +januar,februar,mars,apríl,mai,juni,juli,august,september,oktober,november,desember, +januar,februar,mars,apríl,mai,juni,juli,august,september,oktober,november,desember, +Gregorianski álmanakkin +HH.mm.ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yyyy +su,má,tý,mi,hó,fr,ley +HH.mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +. +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/fr b/dna/Cultures/fr new file mode 100644 index 0000000..51cf23c --- /dev/null +++ b/dna/Cultures/fr @@ -0,0 +1,20 @@ +fr +0x000c + +French +français +French +fr +fra +FRA +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +fr +True +1252 +20297 +False +; +10000 +850 diff --git a/dna/Cultures/fr-BE b/dna/Cultures/fr-BE new file mode 100644 index 0000000..35a648c --- /dev/null +++ b/dna/Cultures/fr-BE @@ -0,0 +1,72 @@ +fr-BE +0x080c +fr +French (Belgium) +français (Belgique) +French (Belgium) +fr +fra +FRB +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +fr-BE +False +1252 +20297 +False +; +10000 +850 +2 +, +. +3 +12 +2 +€ +1 +Non Numérique +0,1,2,3,4,5,6,7,8,9 +-Infini +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ ++Infini ++ +dim.,lun.,mar.,mer.,jeu.,ven.,sam. +janv.,févr.,mars,avr.,mai,juin,juil.,août,sept.,oct.,nov.,déc., +janv.,févr.,mars,avr.,mai,juin,juil.,août,sept.,oct.,nov.,déc., + +0 +/ +dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi +1 +dddd d MMMM yyyy H:mm:ss +dddd d MMMM yyyy +H:mm:ss +d MMMM +janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre, +janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre, +calendrier grégorien +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d/MM/yyyy +di,lu,ma,me,je,ve,sa +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/fr-CA b/dna/Cultures/fr-CA new file mode 100644 index 0000000..f665b30 --- /dev/null +++ b/dna/Cultures/fr-CA @@ -0,0 +1,72 @@ +fr-CA +0x0c0c +fr +French (Canada) +français (Canada) +French (Canada) +fr +fra +FRC +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +fr-CA +False +1252 +20297 +False +; +10000 +850 +2 +, +  +3 +15 +3 +$ +1 +Non Numérique +0,1,2,3,4,5,6,7,8,9 +-Infini +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ ++Infini ++ +dim.,lun.,mar.,mer.,jeu.,ven.,sam. +janv.,févr.,mars,avr.,mai,juin,juil.,août,sept.,oct.,nov.,déc., +janv.,févr.,mars,avr.,mai,juin,juil.,août,sept.,oct.,nov.,déc., + +0 +- +dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi +0 +d MMMM yyyy HH:mm:ss +d MMMM yyyy +HH:mm:ss +d MMMM +janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre, +janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre, +calendrier grégorien +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy-MM-dd +di,lu,ma,me,je,ve,sa +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/fr-CH b/dna/Cultures/fr-CH new file mode 100644 index 0000000..78853f9 --- /dev/null +++ b/dna/Cultures/fr-CH @@ -0,0 +1,72 @@ +fr-CH +0x100c +fr +French (Switzerland) +français (Suisse) +French (Switzerland) +fr +fra +FRS +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +fr-CH +False +1252 +20297 +False +; +10000 +850 +2 +. +' +3 +2 +2 +SFr. +1 +Non Numérique +0,1,2,3,4,5,6,7,8,9 +-Infini +- +2 +. +' +3 +1 +2 +. +' +3 +0 +0 +% +‰ ++Infini ++ +dim.,lun.,mar.,mer.,jeu.,ven.,sam. +janv.,févr.,mars,avr.,mai,juin,juil.,août,sept.,oct.,nov.,déc., +janv.,févr.,mars,avr.,mai,juin,juil.,août,sept.,oct.,nov.,déc., + +2 +. +dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi +1 +dddd, d. MMMM yyyy HH:mm:ss +dddd, d. MMMM yyyy +HH:mm:ss +d MMMM +janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre, +janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre, +calendrier grégorien +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +di,lu,ma,me,je,ve,sa +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/fr-FR b/dna/Cultures/fr-FR new file mode 100644 index 0000000..fec69f9 --- /dev/null +++ b/dna/Cultures/fr-FR @@ -0,0 +1,72 @@ +fr-FR +0x040c +fr +French (France) +français (France) +French (France) +fr +fra +FRA +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +fr-FR +False +1252 +20297 +False +; +10000 +850 +2 +, +  +3 +8 +3 +€ +1 +Non Numérique +0,1,2,3,4,5,6,7,8,9 +-Infini +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ ++Infini ++ +dim.,lun.,mar.,mer.,jeu.,ven.,sam. +janv.,févr.,mars,avr.,mai,juin,juil.,août,sept.,oct.,nov.,déc., +janv.,févr.,mars,avr.,mai,juin,juil.,août,sept.,oct.,nov.,déc., + +0 +/ +dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi +1 +dddd d MMMM yyyy HH:mm:ss +dddd d MMMM yyyy +HH:mm:ss +d MMMM +janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre, +janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre, +calendrier grégorien +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +di,lu,ma,me,je,ve,sa +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/fr-LU b/dna/Cultures/fr-LU new file mode 100644 index 0000000..ae00c0b --- /dev/null +++ b/dna/Cultures/fr-LU @@ -0,0 +1,72 @@ +fr-LU +0x140c +fr +French (Luxembourg) +français (Luxembourg) +French (Luxembourg) +fr +fra +FRL +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +fr-LU +False +1252 +20297 +False +; +10000 +850 +2 +, +  +3 +8 +3 +€ +1 +Non Numérique +0,1,2,3,4,5,6,7,8,9 +-Infini +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ ++Infini ++ +dim.,lun.,mar.,mer.,jeu.,ven.,sam. +janv.,févr.,mars,avr.,mai,juin,juil.,août,sept.,oct.,nov.,déc., +janv.,févr.,mars,avr.,mai,juin,juil.,août,sept.,oct.,nov.,déc., + +0 +/ +dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi +1 +dddd d MMMM yyyy HH:mm:ss +dddd d MMMM yyyy +HH:mm:ss +d MMMM +janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre, +janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre, +calendrier grégorien +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +di,lu,ma,me,je,ve,sa +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/fr-MC b/dna/Cultures/fr-MC new file mode 100644 index 0000000..fec5fb9 --- /dev/null +++ b/dna/Cultures/fr-MC @@ -0,0 +1,72 @@ +fr-MC +0x180c +fr +French (Principality of Monaco) +français (Principauté de Monaco) +French (Principality of Monaco) +fr +fra +FRM +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +fr-MC +False +1252 +20297 +False +; +10000 +850 +2 +, +  +3 +8 +3 +€ +1 +Non Numérique +0,1,2,3,4,5,6,7,8,9 +-Infini +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ ++Infini ++ +dim.,lun.,mar.,mer.,jeu.,ven.,sam. +janv.,févr.,mars,avr.,mai,juin,juil.,août,sept.,oct.,nov.,déc., +janv.,févr.,mars,avr.,mai,juin,juil.,août,sept.,oct.,nov.,déc., + +0 +/ +dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi +1 +dddd d MMMM yyyy HH:mm:ss +dddd d MMMM yyyy +HH:mm:ss +d MMMM +janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre, +janvier,février,mars,avril,mai,juin,juillet,août,septembre,octobre,novembre,décembre, +calendrier grégorien +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +di,lu,ma,me,je,ve,sa +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/gl b/dna/Cultures/gl new file mode 100644 index 0000000..beb8d48 --- /dev/null +++ b/dna/Cultures/gl @@ -0,0 +1,20 @@ +gl +0x0056 + +Galician +galego +Galician +gl +glg +GLC +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +gl +True +1252 +500 +False +, +10000 +850 diff --git a/dna/Cultures/gl-ES b/dna/Cultures/gl-ES new file mode 100644 index 0000000..5803117 --- /dev/null +++ b/dna/Cultures/gl-ES @@ -0,0 +1,72 @@ +gl-ES +0x0456 +gl +Galician (Galician) +galego (galego) +Galician (Galician) +gl +glg +GLC +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +gl-ES +False +1252 +500 +False +, +10000 +850 +2 +, +. +3 +8 +3 +€ +1 +NeuN +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinito ++ +dom,luns,mar,mér,xov,ven,sab +xan,feb,mar,abr,maio,xuñ,xull,ago,set,out,nov,dec, +xan,feb,mar,abr,maio,xuñ,xull,ago,set,out,nov,dec, +a.m. +0 +/ +domingo,luns,martes,mércores,xoves,venres,sábado +1 +dddd, dd' de 'MMMM' de 'yyyy H:mm:ss +dddd, dd' de 'MMMM' de 'yyyy +H:mm:ss +dd MMMM +xaneiro,febreiro,marzo,abril,maio,xuño,xullo,agosto,setembro,outubro,novembro,decembro, +xaneiro,febreiro,marzo,abril,maio,xuño,xullo,agosto,setembro,outubro,novembro,decembro, +Calendario Gregoriano +H:mm:ss +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yy +do,lu,ma,mé,xo,ve,sa +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/gu b/dna/Cultures/gu new file mode 100644 index 0000000..fdb45da --- /dev/null +++ b/dna/Cultures/gu @@ -0,0 +1,20 @@ +gu +0x0047 + +Gujarati +ગુજરાતી +Gujarati +gu +guj +GUJ +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +gu +True +0 +500 +False +, +2 +1 diff --git a/dna/Cultures/gu-IN b/dna/Cultures/gu-IN new file mode 100644 index 0000000..4bfbb84 --- /dev/null +++ b/dna/Cultures/gu-IN @@ -0,0 +1,72 @@ +gu-IN +0x0447 +gu +Gujarati (India) +ગુજરાતી (ભારત) +Gujarati (India) +gu +guj +GUJ +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +gu-IN +False +0 +500 +False +, +2 +1 +2 +. +, +3,2 +12 +2 +રૂ +1 +NaN +૦,૧,૨,૩,૪,૫,૬,૭,૮,૯ +-Infinity +- +2 +. +, +3,2 +1 +2 +. +, +3,2 +0 +0 +% +‰ +Infinity ++ +રવિ,સોમ,મંગળ,બુધ,ગુરુ,શુક્ર,શનિ +જાન્યુ,ફેબ્રુ,માર્ચ,એપ્રિલ,મે,જૂન,જુલાઈ,ઑગસ્ટ,સપ્ટે,ઑક્ટો,નવે,ડિસે, +જાન્યુ,ફેબ્રુ,માર્ચ,એપ્રિલ,મે,જૂન,જુલાઈ,ઑગસ્ટ,સપ્ટે,ઑક્ટો,નવે,ડિસે, +પૂર્વ મધ્યાહ્ન +0 +- +રવિવાર,સોમવાર,મંગળવાર,બુધવાર,ગુરુવાર,શુક્રવાર,શનિવાર +1 +dd MMMM yyyy HH:mm:ss +dd MMMM yyyy +HH:mm:ss +dd MMMM +જાન્યુઆરી,ફેબ્રુઆરી,માર્ચ,એપ્રિલ,મે,જૂન,જુલાઈ,ઑગસ્ટ,સપ્ટેમ્બર,ઑક્ટ્બર,નવેમ્બર,ડિસેમ્બર, +જાન્યુઆરી,ફેબ્રુઆરી,માર્ચ,એપ્રિલ,મે,જૂન,જુલાઈ,ઑગસ્ટ,સપ્ટેમ્બર,ઑક્ટ્બર,નવેમ્બર,ડિસેમ્બર, +અંગ્રેજી કૅલેન્ડર +HH:mm:ss +ઉત્તર મધ્યાહ્ન +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yy +ર,સ,મ,બ,ગ,શ,શ +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/he b/dna/Cultures/he new file mode 100644 index 0000000..4745b12 --- /dev/null +++ b/dna/Cultures/he @@ -0,0 +1,20 @@ +he +0x000d + +Hebrew +עברית +Hebrew +he +heb +HEB +GregorianCalendar:Localized +GregorianCalendar:Localized,HebrewCalendar +65 +he +True +1255 +500 +True +, +10005 +862 diff --git a/dna/Cultures/he-IL b/dna/Cultures/he-IL new file mode 100644 index 0000000..9d4813a --- /dev/null +++ b/dna/Cultures/he-IL @@ -0,0 +1,72 @@ +he-IL +0x040d +he +Hebrew (Israel) +עברית (ישראל) +Hebrew (Israel) +he +heb +HEB +GregorianCalendar:Localized +GregorianCalendar:Localized,HebrewCalendar +70 +he-IL +False +1255 +500 +True +, +10005 +862 +2 +. +, +3 +2 +2 +₪ +1 +לא מספר +0,1,2,3,4,5,6,7,8,9 +אינסוף שלילי +- +2 +. +, +3 +1 +2 +. +, +3 +1 +1 +% +‰ +אינסוף חיובי ++ +יום א,יום ב,יום ג,יום ד,יום ה,יום ו,שבת +ינו,פבר,מרץ,אפר,מאי,יונ,יול,אוג,ספט,אוק,נוב,דצמ, +ינו,פבר,מרץ,אפר,מאי,יונ,יול,אוג,ספט,אוק,נוב,דצמ, +AM +0 +/ +יום ראשון,יום שני,יום שלישי,יום רביעי,יום חמישי,יום שישי,שבת +0 +dddd dd MMMM yyyy HH:mm:ss +dddd dd MMMM yyyy +HH:mm:ss +dd MMMM +ינואר,פברואר,מרץ,אפריל,מאי,יוני,יולי,אוגוסט,ספטמבר,אוקטובר,נובמבר,דצמבר, +ינואר,פברואר,מרץ,אפריל,מאי,יוני,יולי,אוגוסט,ספטמבר,אוקטובר,נובמבר,דצמבר, +לוח שנה גרגוריאני +HH:mm:ss +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +א,ב,ג,ד,ה,ו,ש +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/hi b/dna/Cultures/hi new file mode 100644 index 0000000..048dcfe --- /dev/null +++ b/dna/Cultures/hi @@ -0,0 +1,20 @@ +hi +0x0039 + +Hindi +हिंदी +Hindi +hi +hin +HIN +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +hi +True +0 +500 +False +, +2 +1 diff --git a/dna/Cultures/hi-IN b/dna/Cultures/hi-IN new file mode 100644 index 0000000..75fe0ce --- /dev/null +++ b/dna/Cultures/hi-IN @@ -0,0 +1,72 @@ +hi-IN +0x0439 +hi +Hindi (India) +हिंदी (भारत) +Hindi (India) +hi +hin +HIN +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +hi-IN +False +0 +500 +False +, +2 +1 +2 +. +, +3,2 +12 +2 +रु +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3,2 +1 +2 +. +, +3,2 +0 +0 +% +‰ +Infinity ++ +रवि.,सोम.,मंगल.,बुध.,गुरु.,शुक्र.,शनि. +जनवरी,फरवरी,मार्च,अप्रैल,मई,जून,जुलाई,अगस्त,सितम्बर,अक्तूबर,नवम्बर,दिसम्बर, +जनवरी,फरवरी,मार्च,अप्रैल,मई,जून,जुलाई,अगस्त,सितम्बर,अक्तूबर,नवम्बर,दिसम्बर, +पूर्वाह्न +0 +- +रविवार,सोमवार,मंगलवार,बुधवार,गुरुवार,शुक्रवार,शनिवार +1 +dd MMMM yyyy HH:mm:ss +dd MMMM yyyy +HH:mm:ss +dd MMMM +जनवरी,फरवरी,मार्च,अप्रैल,मई,जून,जुलाई,अगस्त,सितम्बर,अक्तूबर,नवम्बर,दिसम्बर, +जनवरी,फरवरी,मार्च,अप्रैल,मई,जून,जुलाई,अगस्त,सितम्बर,अक्तूबर,नवम्बर,दिसम्बर, +अंग्रेज़ी कैलेन्डर +HH:mm:ss +अपराह्न +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yyyy +र,स,म,ब,ग,श,श +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/hr b/dna/Cultures/hr new file mode 100644 index 0000000..e8a5855 --- /dev/null +++ b/dna/Cultures/hr @@ -0,0 +1,20 @@ +hr +0x001a + +Croatian +hrvatski +Croatian +hr +hrv +HRV +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +hr +True +1250 +500 +False +; +10082 +852 diff --git a/dna/Cultures/hr-BA b/dna/Cultures/hr-BA new file mode 100644 index 0000000..9d5d180 --- /dev/null +++ b/dna/Cultures/hr-BA @@ -0,0 +1,72 @@ +hr-BA +0x101a + +Croatian (Bosnia and Herzegovina) +hrvatski (Bosna i Hercegovina) +Croatian (Bosnia and Herzegovina) +hr +hr +HRB +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +hr-BA +False +1250 +870 +False +; +10082 +852 +2 +, +. +3 +8 +3 +KM +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +2 +2 +, +. +3 +0 +0 +% +‰ +Infinity ++ +ned,pon,uto,sri,čet,pet,sub +sij,vlj,ožu,tra,svi,lip,srp,kol,ruj,lis,stu,pro, +sij,vlj,ožu,tra,svi,lip,srp,kol,ruj,lis,stu,pro, + +0 +. +nedjelja,ponedjeljak,utorak,srijeda,četvrtak,petak,subota +1 +d. MMMM yyyy H:mm:ss +d. MMMM yyyy +H:mm:ss +MMMM dd +siječanj,veljača,ožujak,travanj,svibanj,lipanj,srpanj,kolovoz,rujan,listopad,studeni,prosinac, +siječanj,veljača,ožujak,travanj,svibanj,lipanj,srpanj,kolovoz,rujan,listopad,studeni,prosinac, +gregorijanski kalendar +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.M.yyyy +ned,pon,uto,sri,čet,pet,sub +H:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/hr-HR b/dna/Cultures/hr-HR new file mode 100644 index 0000000..50e7790 --- /dev/null +++ b/dna/Cultures/hr-HR @@ -0,0 +1,72 @@ +hr-HR +0x041a +hr +Croatian (Croatia) +hrvatski (Hrvatska) +Croatian (Croatia) +hr +hrv +HRV +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +hr-HR +False +1250 +500 +False +; +10082 +852 +2 +, +. +3 +8 +3 +kn +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +2 +2 +, +. +3 +1 +1 +% +‰ +Infinity ++ +ned,pon,uto,sri,čet,pet,sub +sij,vlj,ožu,tra,svi,lip,srp,kol,ruj,lis,stu,pro, +sij,vlj,ožu,tra,svi,lip,srp,kol,ruj,lis,stu,pro, + +0 +. +nedjelja,ponedjeljak,utorak,srijeda,četvrtak,petak,subota +1 +d. MMMM yyyy H:mm:ss +d. MMMM yyyy +H:mm:ss +d. MMMM +siječanj,veljača,ožujak,travanj,svibanj,lipanj,srpanj,kolovoz,rujan,listopad,studeni,prosinac, +siječanj,veljača,ožujak,travanj,svibanj,lipanj,srpanj,kolovoz,rujan,listopad,studeni,prosinac, +gregorijanski kalendar +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.M.yyyy +ne,po,ut,sr,če,pe,su +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/hu b/dna/Cultures/hu new file mode 100644 index 0000000..c19feba --- /dev/null +++ b/dna/Cultures/hu @@ -0,0 +1,20 @@ +hu +0x000e + +Hungarian +magyar +Hungarian +hu +hun +HUN +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +hu +True +1250 +500 +False +; +10029 +852 diff --git a/dna/Cultures/hu-HU b/dna/Cultures/hu-HU new file mode 100644 index 0000000..83e78bc --- /dev/null +++ b/dna/Cultures/hu-HU @@ -0,0 +1,72 @@ +hu-HU +0x040e +hu +Hungarian (Hungary) +magyar (Magyarország) +Hungarian (Hungary) +hu +hun +HUN +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +hu-HU +False +1250 +500 +False +; +10029 +852 +2 +, +  +3 +8 +3 +Ft +1 +nem szám +0,1,2,3,4,5,6,7,8,9 +negatív végtelen +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +végtelen ++ +V,H,K,Sze,Cs,P,Szo +jan.,febr.,márc.,ápr.,máj.,jún.,júl.,aug.,szept.,okt.,nov.,dec., +jan.,febr.,márc.,ápr.,máj.,jún.,júl.,aug.,szept.,okt.,nov.,dec., +de. +0 +. +vasárnap,hétfő,kedd,szerda,csütörtök,péntek,szombat +1 +yyyy. MMMM d. H:mm:ss +yyyy. MMMM d. +H:mm:ss +MMMM d. +január,február,március,április,május,június,július,augusztus,szeptember,október,november,december, +január,február,március,április,május,június,július,augusztus,szeptember,október,november,december, +Gergely-naptár +H:mm:ss +du. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy. MM. dd. +V,H,K,Sze,Cs,P,Szo +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +yyyy. MMMM diff --git a/dna/Cultures/hy b/dna/Cultures/hy new file mode 100644 index 0000000..e3f558d --- /dev/null +++ b/dna/Cultures/hy @@ -0,0 +1,20 @@ +hy +0x002b + +Armenian +Հայերեն +Armenian +hy +hye +HYE +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +hy +True +0 +500 +False +, +2 +1 diff --git a/dna/Cultures/hy-AM b/dna/Cultures/hy-AM new file mode 100644 index 0000000..e8cae0c --- /dev/null +++ b/dna/Cultures/hy-AM @@ -0,0 +1,72 @@ +hy-AM +0x042b +hy +Armenian (Armenia) +Հայերեն (Հայաստան) +Armenian (Armenia) +hy +hye +HYE +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +hy-AM +False +0 +500 +False +, +2 +1 +2 +. +, +3 +8 +3 +դր. +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Կիր,Երկ,Երք,Չրք,Հնգ,ՈՒր,Շբթ +ՀՆՎ,ՓՏՎ,ՄՐՏ,ԱՊՐ,ՄՅՍ,ՀՆՍ,ՀԼՍ,ՕԳՍ,ՍԵՊ,ՀՈԿ,ՆՈՅ,ԴԵԿ, +ՀՆՎ,ՓՏՎ,ՄՐՏ,ԱՊՐ,ՄՅՍ,ՀՆՍ,ՀԼՍ,ՕԳՍ,ՍԵՊ,ՀՈԿ,ՆՈՅ,ԴԵԿ, + +0 +. +Կիրակի,Երկուշաբթի,Երեքշաբթի,Չորեքշաբթի,Հինգշաբթի,ՈՒրբաթ,Շաբաթ +1 +d MMMM, yyyy H:mm:ss +d MMMM, yyyy +H:mm:ss +d MMMM +Հունվար,Փետրվար,Մարտ,Ապրիլ,Մայիս,Հունիս,Հուլիս,Օգոստոս,Սեպտեմբեր,Հոկտեմբեր,Նոյեմբեր,Դեկտեմբեր, +Հունվար,Փետրվար,Մարտ,Ապրիլ,Մայիս,Հունիս,Հուլիս,Օգոստոս,Սեպտեմբեր,Հոկտեմբեր,Նոյեմբեր,Դեկտեմբեր, +Օրացույց +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +Կ,Ե,Ե,Չ,Հ,Ո,Շ +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/id b/dna/Cultures/id new file mode 100644 index 0000000..5ea4f80 --- /dev/null +++ b/dna/Cultures/id @@ -0,0 +1,20 @@ +id +0x0021 + +Indonesian +Bahasa Indonesia +Indonesian +id +ind +IND +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +id +True +1252 +500 +False +; +10000 +850 diff --git a/dna/Cultures/id-ID b/dna/Cultures/id-ID new file mode 100644 index 0000000..a5f106b --- /dev/null +++ b/dna/Cultures/id-ID @@ -0,0 +1,72 @@ +id-ID +0x0421 +id +Indonesian (Indonesia) +Bahasa Indonesia (Indonesia) +Indonesian (Indonesia) +id +ind +IND +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +id-ID +False +1252 +500 +False +; +10000 +850 +0 +, +. +3 +0 +0 +Rp +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinity ++ +Minggu,Sen,Sel,Rabu,Kamis,Jumat,Sabtu +Jan,Feb,Mar,Apr,Mei,Jun,Jul,Agust,Sep,Okt,Nop,Des, +Jan,Feb,Mar,Apr,Mei,Jun,Jul,Agust,Sep,Okt,Nop,Des, + +0 +/ +Minggu,Senin,Selasa,Rabu,Kamis,Jumat,Sabtu +1 +dd MMMM yyyy H:mm:ss +dd MMMM yyyy +H:mm:ss +dd MMMM +Januari,Februari,Maret,April,Mei,Juni,Juli,Agustus,September,Oktober,Nopember,Desember, +Januari,Februari,Maret,April,Mei,Juni,Juli,Agustus,September,Oktober,Nopember,Desember, +kalendar Masehi +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +M,S,S,R,K,J,S +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/is b/dna/Cultures/is new file mode 100644 index 0000000..3dc8315 --- /dev/null +++ b/dna/Cultures/is @@ -0,0 +1,20 @@ +is +0x000f + +Icelandic +íslenska +Icelandic +is +isl +ISL +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +is +True +1252 +20871 +False +; +10079 +850 diff --git a/dna/Cultures/is-IS b/dna/Cultures/is-IS new file mode 100644 index 0000000..e692f1a --- /dev/null +++ b/dna/Cultures/is-IS @@ -0,0 +1,72 @@ +is-IS +0x040f +is +Icelandic (Iceland) +íslenska (Ísland) +Icelandic (Iceland) +is +isl +ISL +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +is-IS +False +1252 +20871 +False +; +10079 +850 +0 +, +. +3 +8 +3 +kr. +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-INF +- +2 +, +. +3 +1 +2 +, +. +3 +1 +1 +% +‰ +INF ++ +sun.,mán.,þri.,mið.,fim.,fös.,lau. +jan.,feb.,mar.,apr.,maí,jún.,júl.,ágú.,sep.,okt.,nóv.,des., +jan.,feb.,mar.,apr.,maí,jún.,júl.,ágú.,sep.,okt.,nóv.,des., + +2 +. +sunnudagur,mánudagur,þriðjudagur,miðvikudagur,fimmtudagur,föstudagur,laugardagur +1 +d. MMMM yyyy HH:mm:ss +d. MMMM yyyy +HH:mm:ss +d. MMMM +janúar,febrúar,mars,apríl,maí,júní,júlí,ágúst,september,október,nóvember,desember, +janúar,febrúar,mars,apríl,maí,júní,júlí,ágúst,september,október,nóvember,desember, +gregorískt tímatal +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.M.yyyy +su,má,þr,mi,fi,fö,la +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/it b/dna/Cultures/it new file mode 100644 index 0000000..41f0355 --- /dev/null +++ b/dna/Cultures/it @@ -0,0 +1,20 @@ +it +0x0010 + +Italian +italiano +Italian +it +ita +ITA +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +it +True +1252 +20280 +False +; +10000 +850 diff --git a/dna/Cultures/it-CH b/dna/Cultures/it-CH new file mode 100644 index 0000000..174a799 --- /dev/null +++ b/dna/Cultures/it-CH @@ -0,0 +1,72 @@ +it-CH +0x0810 +it +Italian (Switzerland) +italiano (Svizzera) +Italian (Switzerland) +it +ita +ITS +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +it-CH +False +1252 +500 +False +; +10000 +850 +2 +. +' +3 +2 +2 +SFr. +1 +Non un numero reale +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +. +' +3 +1 +2 +. +' +3 +1 +1 +% +‰ ++Infinito ++ +dom,lun,mar,mer,gio,ven,sab +gen,feb,mar,apr,mag,gio,lug,ago,set,ott,nov,dic, +gen,feb,mar,apr,mag,gio,lug,ago,set,ott,nov,dic, + +2 +. +domenica,lunedì,martedì,mercoledì,giovedì,venerdì,sabato +1 +dddd, d. MMMM yyyy HH:mm:ss +dddd, d. MMMM yyyy +HH:mm:ss +d. MMMM +gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre, +gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre, +calendario gregoriano +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +do,lu,ma,me,gi,ve,sa +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/it-IT b/dna/Cultures/it-IT new file mode 100644 index 0000000..964e75b --- /dev/null +++ b/dna/Cultures/it-IT @@ -0,0 +1,72 @@ +it-IT +0x0410 +it +Italian (Italy) +italiano (Italia) +Italian (Italy) +it +ita +ITA +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +it-IT +False +1252 +20280 +False +; +10000 +850 +2 +, +. +3 +9 +2 +€ +1 +Non un numero reale +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +, +. +3 +1 +2 +, +. +3 +1 +1 +% +‰ ++Infinito ++ +dom,lun,mar,mer,gio,ven,sab +gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic, +gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic, + +2 +/ +domenica,lunedì,martedì,mercoledì,giovedì,venerdì,sabato +1 +dddd d MMMM yyyy H.mm.ss +dddd d MMMM yyyy +H.mm.ss +dd MMMM +gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre, +gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre, +calendario gregoriano +H.mm.ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +do,lu,ma,me,gi,ve,sa +H.mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +. +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/ja b/dna/Cultures/ja new file mode 100644 index 0000000..a148352 --- /dev/null +++ b/dna/Cultures/ja @@ -0,0 +1,20 @@ +ja +0x0011 + +Japanese +日本語 +Japanese +ja +jpn +JPN +GregorianCalendar:Localized +GregorianCalendar:Localized,JapaneseCalendar,GregorianCalendar:USEnglish +65 +ja +True +932 +20290 +False +, +10001 +932 diff --git a/dna/Cultures/ja-JP b/dna/Cultures/ja-JP new file mode 100644 index 0000000..5a7f682 --- /dev/null +++ b/dna/Cultures/ja-JP @@ -0,0 +1,72 @@ +ja-JP +0x0411 +ja +Japanese (Japan) +日本語 (日本) +Japanese (Japan) +ja +jpn +JPN +GregorianCalendar:Localized +GregorianCalendar:Localized,JapaneseCalendar,GregorianCalendar:USEnglish +70 +ja-JP +False +932 +20290 +False +, +10001 +932 +0 +. +, +3 +1 +0 +¥ +1 +NaN (非数値) +0,1,2,3,4,5,6,7,8,9 +-∞ +- +2 +. +, +3 +1 +2 +. +, +3 +1 +1 +% +‰ ++∞ ++ +日,月,火,水,木,金,土 +1,2,3,4,5,6,7,8,9,10,11,12, +1,2,3,4,5,6,7,8,9,10,11,12, +午前 +0 +/ +日曜日,月曜日,火曜日,水曜日,木曜日,金曜日,土曜日 +0 +yyyy'年'M'月'd'日' H:mm:ss +yyyy'年'M'月'd'日' +H:mm:ss +M'月'd'日' +1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月, +1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月, +西暦 (日本語) +H:mm:ss +午後 +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy/MM/dd +日,月,火,水,木,金,土 +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +yyyy'年'M'月' diff --git a/dna/Cultures/ka b/dna/Cultures/ka new file mode 100644 index 0000000..93cbe95 --- /dev/null +++ b/dna/Cultures/ka @@ -0,0 +1,20 @@ +ka +0x0037 + +Georgian +ქართული +Georgian +ka +kat +KAT +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +ka +True +0 +500 +False +; +2 +1 diff --git a/dna/Cultures/ka-GE b/dna/Cultures/ka-GE new file mode 100644 index 0000000..1f2b1e5 --- /dev/null +++ b/dna/Cultures/ka-GE @@ -0,0 +1,72 @@ +ka-GE +0x0437 +ka +Georgian (Georgia) +ქართული (საქართველო) +Georgian (Georgia) +ka +kat +KAT +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +ka-GE +False +0 +500 +False +; +2 +1 +2 +, +  +3 +8 +3 +Lari +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +Infinity ++ +კვირა,ორშაბათი,სამშაბათი,ოთხშაბათი,ხუთშაბათი,პარასკევი,შაბათი +იან,თებ,მარ,აპრ,მაის,ივნ,ივლ,აგვ,სექ,ოქტ,ნოემ,დეკ, +იან,თებ,მარ,აპრ,მაის,ივნ,ივლ,აგვ,სექ,ოქტ,ნოემ,დეკ, + +0 +. +კვირა,ორშაბათი,სამშაბათი,ოთხშაბათი,ხუთშაბათი,პარასკევი,შაბათი +1 +yyyy 'წლის' dd MM, dddd H:mm:ss +yyyy 'წლის' dd MM, dddd +H:mm:ss +dd MM +იანვარი,თებერვალი,მარტი,აპრილი,მაისი,ივნისი,ივლისი,აგვისტო,სექტემბერი,ოქტომბერი,ნოემბერი,დეკემბერი, +იანვარი,თებერვალი,მარტი,აპრილი,მაისი,ივნისი,ივლისი,აგვისტო,სექტემბერი,ოქტომბერი,ნოემბერი,დეკემბერი, +გრიგორიანული კალენდარი +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +კ,ო,ს,ო,ხ,პ,შ +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/kk b/dna/Cultures/kk new file mode 100644 index 0000000..6bfcb94 --- /dev/null +++ b/dna/Cultures/kk @@ -0,0 +1,20 @@ +kk +0x003f + +Kazakh +Қазащb +Kazakh +kk +kaz +KKZ +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +kk +True +1251 +20880 +False +; +10007 +866 diff --git a/dna/Cultures/kk-KZ b/dna/Cultures/kk-KZ new file mode 100644 index 0000000..f5d0bca --- /dev/null +++ b/dna/Cultures/kk-KZ @@ -0,0 +1,72 @@ +kk-KZ +0x043f +kk +Kazakh (Kazakhstan) +Қазақ (Қазақстан) +Kazakh (Kazakhstan) +kk +kaz +KKZ +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +kk-KZ +False +1251 +20880 +False +; +10007 +866 +2 +- +  +3 +1 +0 +Т +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +1 +1 +% +‰ +Infinity ++ +Жк,Дс,Сс,Ср,Бс,Жм,Сн +Қаң,Ақп,Нау,Сәу,Мам,Мау,Шіл,Там,Қыр,Қаз,Қар,Жел, +Қаң,Ақп,Нау,Сәу,Мам,Мау,Шіл,Там,Қыр,Қаз,Қар,Жел, + +0 +. +Жексенбі,Дүйсенбі,Сейсенбі,Сәрсенбі,Бейсенбі,Жұма,Сенбі +1 +d MMMM yyyy 'ж.' H:mm:ss +d MMMM yyyy 'ж.' +H:mm:ss +d MMMM +қаңтар,ақпан,наурыз,сәуір,мамыр,маусым,шілде,тамыз,қыркүйек,қазан,қараша,желтоқсан, +қаңтар,ақпан,наурыз,сәуір,мамыр,маусым,шілде,тамыз,қыркүйек,қазан,қараша,желтоқсан, +григорианкүнтізбек +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +Жк,Дс,Сс,Ср,Бс,Жм,Сн +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/kn b/dna/Cultures/kn new file mode 100644 index 0000000..b5e0ae9 --- /dev/null +++ b/dna/Cultures/kn @@ -0,0 +1,20 @@ +kn +0x004b + +Kannada +ಕನ್ನಡ +Kannada +kn +kan +KDI +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +kn +True +0 +500 +False +, +2 +1 diff --git a/dna/Cultures/kn-IN b/dna/Cultures/kn-IN new file mode 100644 index 0000000..88fb8c4 --- /dev/null +++ b/dna/Cultures/kn-IN @@ -0,0 +1,72 @@ +kn-IN +0x044b +kn +Kannada (India) +ಕನ್ನಡ (ಭಾರತ) +Kannada (India) +kn +kan +KDI +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +kn-IN +False +0 +500 +False +, +2 +1 +2 +. +, +3,2 +12 +2 +ರೂ +1 +NaN +೦,೧,೨,೩,೪,೫,೬,೭,೮,೯ +-Infinity +- +2 +. +, +3,2 +1 +2 +. +, +3,2 +0 +0 +% +‰ +Infinity ++ +ಭಾನು.,ಸೋಮ.,ಮಂಗಳ.,ಬುಧ.,ಗುರು.,ಶುಕ್ರ.,ಶನಿ. +ಜನವರಿ,ಫೆಬ್ರವರಿ,ಮಾರ್ಚ್,ಎಪ್ರಿಲ್,ಮೇ,ಜೂನ್,ಜುಲೈ,ಆಗಸ್ಟ್,ಸೆಪ್ಟಂಬರ್,ಅಕ್ಟೋಬರ್,ನವೆಂಬರ್,ಡಿಸೆಂಬರ್, +ಜನವರಿ,ಫೆಬ್ರವರಿ,ಮಾರ್ಚ್,ಎಪ್ರಿಲ್,ಮೇ,ಜೂನ್,ಜುಲೈ,ಆಗಸ್ಟ್,ಸೆಪ್ಟಂಬರ್,ಅಕ್ಟೋಬರ್,ನವೆಂಬರ್,ಡಿಸೆಂಬರ್, +ಪೂರ್ವಾಹ್ನ +0 +- +ಭಾನುವಾರ,ಸೋಮವಾರ,ಮಂಗಳವಾರ,ಬುಧವಾರ,ಗುರುವಾರ,ಶುಕ್ರವಾರ,ಶನಿವಾರ +1 +dd MMMM yyyy HH:mm:ss +dd MMMM yyyy +HH:mm:ss +dd MMMM +ಜನವರಿ,ಫೆಬ್ರವರಿ,ಮಾರ್ಚ್,ಎಪ್ರಿಲ್,ಮೇ,ಜೂನ್,ಜುಲೈ,ಆಗಸ್ಟ್,ಸೆಪ್ಟಂಬರ್,ಅಕ್ಟೋಬರ್,ನವೆಂಬರ್,ಡಿಸೆಂಬರ್, +ಜನವರಿ,ಫೆಬ್ರವರಿ,ಮಾರ್ಚ್,ಎಪ್ರಿಲ್,ಮೇ,ಜೂನ್,ಜುಲೈ,ಆಗಸ್ಟ್,ಸೆಪ್ಟಂಬರ್,ಅಕ್ಟೋಬರ್,ನವೆಂಬರ್,ಡಿಸೆಂಬರ್, +ಇಂಗ್ಲಿಷ್ ಕ್ಯಾಲೆಂಡರ್ +HH:mm:ss +ಅಪರಾಹ್ನ +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yy +ರ,ಸ,ಮ,ಬ,ಗ,ಶ,ಶ +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ko b/dna/Cultures/ko new file mode 100644 index 0000000..b725482 --- /dev/null +++ b/dna/Cultures/ko @@ -0,0 +1,20 @@ +ko +0x0012 + +Korean +한국어 +Korean +ko +kor +KOR +GregorianCalendar:Localized +GregorianCalendar:Localized,KoreanCalendar,GregorianCalendar:USEnglish +65 +ko +True +949 +20833 +False +, +10003 +949 diff --git a/dna/Cultures/ko-KR b/dna/Cultures/ko-KR new file mode 100644 index 0000000..cb31ee9 --- /dev/null +++ b/dna/Cultures/ko-KR @@ -0,0 +1,72 @@ +ko-KR +0x0412 +ko +Korean (Korea) +한국어 (대한민국) +Korean (Korea) +ko +kor +KOR +GregorianCalendar:Localized +GregorianCalendar:Localized,KoreanCalendar,GregorianCalendar:USEnglish +70 +ko-KR +False +949 +20833 +False +, +10003 +949 +0 +. +, +3 +1 +0 +₩ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +일,월,화,수,목,금,토 +1,2,3,4,5,6,7,8,9,10,11,12, +1,2,3,4,5,6,7,8,9,10,11,12, +오전 +0 +- +일요일,월요일,화요일,수요일,목요일,금요일,토요일 +0 +yyyy'년' M'월' d'일' dddd tt h:mm:ss +yyyy'년' M'월' d'일' dddd +tt h:mm:ss +M'월' d'일' +1월,2월,3월,4월,5월,6월,7월,8월,9월,10월,11월,12월, +1월,2월,3월,4월,5월,6월,7월,8월,9월,10월,11월,12월, +서기 (한글) +tt h:mm:ss +오후 +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy-MM-dd +일,월,화,수,목,금,토 +tt h:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +yyyy'년' M'월' diff --git a/dna/Cultures/kok b/dna/Cultures/kok new file mode 100644 index 0000000..076e632 --- /dev/null +++ b/dna/Cultures/kok @@ -0,0 +1,20 @@ +kok +0x0057 + +Konkani +कोंकणी +Konkani +kok +kok +KNK +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +kok +True +0 +500 +False +, +2 +1 diff --git a/dna/Cultures/kok-IN b/dna/Cultures/kok-IN new file mode 100644 index 0000000..dd54c62 --- /dev/null +++ b/dna/Cultures/kok-IN @@ -0,0 +1,72 @@ +kok-IN +0x0457 +kok +Konkani (India) +कोंकणी (भारत) +Konkani (India) +kok +kok +KNK +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +kok-IN +False +0 +500 +False +, +2 +1 +2 +. +, +3,2 +12 +2 +रु +1 +NaN +०,१,२,३,४,५,६,७,८,९ +-Infinity +- +2 +. +, +3,2 +1 +2 +. +, +3,2 +0 +0 +% +‰ +Infinity ++ +आय.,सोम.,मंगळ.,बुध.,बिरे.,सुक्र.,शेन. +जानेवारी,फेब्रुवारी,मार्च,एप्रिल,मे,जून,जुलै,ऑगस्ट,सप्टेंबर,ऑक्टोबर,नोवेम्बर,डिसेंबर, +जानेवारी,फेब्रुवारी,मार्च,एप्रिल,मे,जून,जुलै,ऑगस्ट,सप्टेंबर,ऑक्टोबर,नोवेम्बर,डिसेंबर, +म.पू. +0 +- +आयतार,सोमार,मंगळार,बुधवार,बिरेस्तार,सुक्रार,शेनवार +1 +dd MMMM yyyy HH:mm:ss +dd MMMM yyyy +HH:mm:ss +dd MMMM +जानेवारी,फेब्रुवारी,मार्च,एप्रिल,मे,जून,जुलै,ऑगस्ट,सप्टेंबर,ऑक्टोबर,नोवेम्बर,डिसेंबर, +जानेवारी,फेब्रुवारी,मार्च,एप्रिल,मे,जून,जुलै,ऑगस्ट,सप्टेंबर,ऑक्टोबर,नोवेम्बर,डिसेंबर, +इंग्रजी कॅलेन्डर +HH:mm:ss +म.नं. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yyyy +आ,स,म,ब,ब,स,श +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ky b/dna/Cultures/ky new file mode 100644 index 0000000..93ec133 --- /dev/null +++ b/dna/Cultures/ky @@ -0,0 +1,20 @@ +ky +0x0040 + +Kyrgyz +Кыргыз +Kyrgyz +ky +kir +KYR +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +ky +True +1251 +20880 +False +; +10007 +866 diff --git a/dna/Cultures/ky-KG b/dna/Cultures/ky-KG new file mode 100644 index 0000000..545720b --- /dev/null +++ b/dna/Cultures/ky-KG @@ -0,0 +1,72 @@ +ky-KG +0x0440 +ky +Kyrgyz (Kyrgyzstan) +Кыргыз (Кыргызстан) +Kyrgyz (Kyrgyzstan) +ky +kir +KYR +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +ky-KG +False +1251 +20880 +False +; +10007 +866 +2 +- +  +3 +8 +3 +сом +0 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +1 +1 +% +‰ +Infinity ++ +Жш,Дш,Шш,Шр,Бш,Жм,Иш +Янв,Фев,Мар,Апр,Май,Июн,Июл,Авг,Сен,Окт,Ноя,Дек, +Янв,Фев,Мар,Апр,Май,Июн,Июл,Авг,Сен,Окт,Ноя,Дек, + +0 +. +Жекшемби,Дүйшөмбү,Шейшемби,Шаршемби,Бейшемби,Жума,Ишемби +1 +d'-'MMMM yyyy'-ж.' H:mm:ss +d'-'MMMM yyyy'-ж.' +H:mm:ss +d MMMM +Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь, +Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь, +григориан календары +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yy +Жш,Дш,Шш,Шр,Бш,Жм,Иш +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy'-ж.' diff --git a/dna/Cultures/lt b/dna/Cultures/lt new file mode 100644 index 0000000..1b07a4b --- /dev/null +++ b/dna/Cultures/lt @@ -0,0 +1,20 @@ +lt +0x0027 + +Lithuanian +lietuvių +Lithuanian +lt +lit +LTH +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +lt +True +1257 +500 +False +; +10029 +775 diff --git a/dna/Cultures/lt-LT b/dna/Cultures/lt-LT new file mode 100644 index 0000000..7a9aa1e --- /dev/null +++ b/dna/Cultures/lt-LT @@ -0,0 +1,72 @@ +lt-LT +0x0427 +lt +Lithuanian (Lithuania) +lietuvių (Lietuva) +Lithuanian (Lithuania) +lt +lit +LTH +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +lt-LT +False +1257 +500 +False +; +10029 +775 +2 +, +. +3 +8 +3 +Lt +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-begalybė +- +2 +, +. +3 +1 +2 +, +. +3 +1 +1 +% +‰ +begalybė ++ +Sk,Pr,An,Tr,Kt,Pn,Št +Sau,Vas,Kov,Bal,Geg,Bir,Lie,Rgp,Rgs,Spl,Lap,Grd, +Sau,Vas,Kov,Bal,Geg,Bir,Lie,Rgp,Rgs,Spl,Lap,Grd, + +0 +. +sekmadienis,pirmadienis,antradienis,trečiadienis,ketvirtadienis,penktadienis,šeštadienis +1 +yyyy 'm.' MMMM d 'd.' HH:mm:ss +yyyy 'm.' MMMM d 'd.' +HH:mm:ss +MMMM d 'd.' +sausio,vasario,kovo,balandžio,gegužės,birželio,liepos,rugpjūčio,rugsėjo,spalio,lapkričio,gruodžio, +sausis,vasaris,kovas,balandis,gegužė,birželis,liepa,rugpjūtis,rugsėjis,spalis,lapkritis,gruodis, +Grigaliaus kalendorius +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy.MM.dd +S,P,A,T,K,Pn,Š +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +yyyy 'm.' MMMM diff --git a/dna/Cultures/lv b/dna/Cultures/lv new file mode 100644 index 0000000..846fc8c --- /dev/null +++ b/dna/Cultures/lv @@ -0,0 +1,20 @@ +lv +0x0026 + +Latvian +latviešu +Latvian +lv +lav +LVI +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +lv +True +1257 +500 +False +; +10029 +775 diff --git a/dna/Cultures/lv-LV b/dna/Cultures/lv-LV new file mode 100644 index 0000000..ad498a0 --- /dev/null +++ b/dna/Cultures/lv-LV @@ -0,0 +1,72 @@ +lv-LV +0x0426 +lv +Latvian (Latvia) +latviešu (Latvija) +Latvian (Latvia) +lv +lav +LVI +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +lv-LV +False +1257 +500 +False +; +10029 +775 +2 +, +  +3 +9 +2 +Ls +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-bezgalība +- +2 +, +  +3 +1 +2 +, +  +3 +1 +1 +% +‰ +bezgalība ++ +Sv,Pr,Ot,Tr,Ce,Pk,Se +Jan,Feb,Mar,Apr,Mai,Jūn,Jūl,Aug,Sep,Okt,Nov,Dec, +Jan,Feb,Mar,Apr,Mai,Jūn,Jūl,Aug,Sep,Okt,Nov,Dec, + +2 +. +svētdiena,pirmdiena,otrdiena,trešdiena,ceturtdiena,piektdiena,sestdiena +1 +dddd, yyyy'. gada 'd. MMMM H:mm:ss +dddd, yyyy'. gada 'd. MMMM +H:mm:ss +d. MMMM +janvārī,februārī,martā,aprīlī,maijā,jūnijā,jūlijā,augustā,septembrī,oktobrī,novembrī,decembrī, +janvāris,februāris,marts,aprīlis,maijs,jūnijs,jūlijs,augusts,septembris,oktobris,novembris,decembris, +Gregora kalendārs +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy.MM.dd. +Sv,Pr,Ot,Tr,Ce,Pk,Se +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +yyyy. MMMM diff --git a/dna/Cultures/mi-NZ b/dna/Cultures/mi-NZ new file mode 100644 index 0000000..bb15879 --- /dev/null +++ b/dna/Cultures/mi-NZ @@ -0,0 +1,72 @@ +mi-NZ +0x0481 + +Maori (New Zealand) +Reo Māori (Aotearoa) +Maori +mi +mi +MRI +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +mi-NZ +False +0 +500 +False +, +2 +1 +2 +. +, +3 +1 +0 +$ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Ta,Ma,Tū,We,Tāi,Pa,Hā +Kohi,Hui,Pou,Pae,Hara,Pipi,Hōngoi,Here,Mahu,Whi-nu,Whi-ra,Haki, +Kohi,Hui,Pou,Pae,Hara,Pipi,Hōngoi,Here,Mahu,Whi-nu,Whi-ra,Haki, +a.m. +0 +/ +Rātapu,Mane,Tūrei,Wenerei,Tāite,Paraire,Hātarei +1 +dddd, d MMMM yyyy h:mm:ss tt +dddd, d MMMM yyyy +h:mm:ss tt +MMMM dd +Kohi-tātea,Hui-tanguru,Poutū-te-rangi,Paenga-whāwhā,Haratua,Pipiri,Hōngoingoi,Here-turi-kōkā,Mahuru,Whiringa-ā-nuku,Whiringa-ā-rangi,Hakihea, +Kohi-tātea,Hui-tanguru,Poutū-te-rangi,Paenga-whāwhā,Haratua,Pipiri,Hōngoingoi,Here-turi-kōkā,Mahuru,Whiringa-ā-nuku,Whiringa-ā-rangi,Hakihea, +Gregorian Calendar +h:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d/MM/yyyy +Ta,Ma,Tū,We,Tāi,Pa,Hā +h:mm:ss tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/mk b/dna/Cultures/mk new file mode 100644 index 0000000..4a3fe8c --- /dev/null +++ b/dna/Cultures/mk @@ -0,0 +1,20 @@ +mk +0x002f + +Macedonian +македонски јазик +Macedonian +mk +mkd +MKI +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +mk +True +1251 +500 +False +; +10007 +866 diff --git a/dna/Cultures/mk-MK b/dna/Cultures/mk-MK new file mode 100644 index 0000000..60ff1bf --- /dev/null +++ b/dna/Cultures/mk-MK @@ -0,0 +1,72 @@ +mk-MK +0x042f +mk +Macedonian (Former Yugoslav Republic of Macedonia) +македонски јазик (Македонија) +Macedonian (Former Yugoslav Republic of Macedonia) +mk +mkd +MKI +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +mk-MK +False +1251 +500 +False +; +10007 +866 +2 +, +. +3 +8 +3 +ден. +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinity ++ +нед,пон,втр,срд,чет,пет,саб +јан,фев,мар,апр,мај,јун,јул,авг,сеп,окт,ное,дек, +јан,фев,мар,апр,мај,јун,јул,авг,сеп,окт,ное,дек, + +2 +. +недела,понеделник,вторник,среда,четврток,петок,сабота +1 +dddd, dd MMMM yyyy HH:mm:ss +dddd, dd MMMM yyyy +HH:mm:ss +dd MMMM +јануари,февруари,март,април,мај,јуни,јули,август,септември,октомври,ноември,декември, +јануари,февруари,март,април,мај,јуни,јули,август,септември,октомври,ноември,декември, +грегоријански календар +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +не,по,вт,ср,че,пе,са +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/ml-IN b/dna/Cultures/ml-IN new file mode 100644 index 0000000..bef2782 --- /dev/null +++ b/dna/Cultures/ml-IN @@ -0,0 +1,72 @@ +ml-IN +0x044c + +Malayalam (India) +മലയാളം (ഭാരതം) +Malayalam (India) +ml +ml +MYM +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +ml-IN +False +0 +500 +False +, +2 +1 +2 +. +, +3,2 +12 +2 +ക +1 +NaN +൦,൧,൨,൩,൪,൫,൬,൭,൮,൯ +-Infinity +- +2 +. +, +3,2 +1 +2 +. +, +3,2 +0 +0 +% +‰ +Infinity ++ +ഞായറ്.,തിങ്കള്.,ചൊവ്വ.,ബുധന്.,വ്യാഴം.,വെളോളി.,ശനി. +ജനുവരി,ഫെബ്റുവരി,മാറ്ച്ച്,ഏപ്റില്,മെയ്,ജൂണ്,ജൂലൈ,ഓഗസ്ററ്,സെപ്ററംബറ്,ഒക്ടോബറ്,നവംബറ്,ഡിസംബറ്, +ജനുവരി,ഫെബ്റുവരി,മാറ്ച്ച്,ഏപ്റില്,മെയ്,ജൂണ്,ജൂലൈ,ഓഗസ്ററ്,സെപ്ററംബറ്,ഒക്ടോബറ്,നവംബറ്,ഡിസംബറ്, +AM +0 +- +ഞായറാഴ്ച,തിങ്കളാഴ്ച,ചൊവ്വാഴ്ച,ബുധനാഴ്ച,വ്യാഴാഴ്ച,വെള്ളിയാഴ്ച,ശനിയാഴ്ച +1 +dd MMMM yyyy HH.mm.ss +dd MMMM yyyy +HH.mm.ss +MMMM dd +ജനുവരി,ഫെബ്റുവരി,മാറ്ച്ച്,ഏപ്റില്,മെയ്,ജൂണ്,ജൂലൈ,ഓഗസ്ററ്,സെപ്ററംബറ്,ഒക്ടോബറ്,നവംബറ്,ഡിസംബറ്, +ജനുവരി,ഫെബ്റുവരി,മാറ്ച്ച്,ഏപ്റില്,മെയ്,ജൂണ്,ജൂലൈ,ഓഗസ്ററ്,സെപ്ററംബറ്,ഒക്ടോബറ്,നവംബറ്,ഡിസംബറ്, +ഇംഗ്ളീഷ് കലണ്ടറ് +HH.mm.ss +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yy +ഞായറ്.,തിങ്കള്.,ചൊവ്വ.,ബുധന്.,വ്യാഴം.,വെളോളി.,ശനി. +HH.mm.ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +. +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/mn b/dna/Cultures/mn new file mode 100644 index 0000000..038a3b2 --- /dev/null +++ b/dna/Cultures/mn @@ -0,0 +1,20 @@ +mn +0x0050 + +Mongolian +Монгол хэл +Mongolian +mn +mon +MON +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +mn +True +1251 +20880 +False +; +10007 +866 diff --git a/dna/Cultures/mn-MN b/dna/Cultures/mn-MN new file mode 100644 index 0000000..5d0af30 --- /dev/null +++ b/dna/Cultures/mn-MN @@ -0,0 +1,72 @@ +mn-MN +0x0450 +mn +Mongolian (Cyrillic, Mongolia) +Монгол хэл (Монгол улс) +Mongolian (Cyrillic, Mongolia) +mn +mon +MON +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +mn-MN +False +1251 +20880 +False +; +10007 +866 +2 +, +  +3 +5 +1 +₮ +0 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +Infinity ++ +Ня,Да,Мя,Лх,Пү,Ба,Бя +I,II,III,IV,V,VI,VII,VШ,IX,X,XI,XII, +I,II,III,IV,V,VI,VII,VШ,IX,X,XI,XII, + +0 +. +Ням,Даваа,Мягмар,Лхагва,Пүрэв,Баасан,Бямба +1 +yyyy 'оны' MMMM d H:mm:ss +yyyy 'оны' MMMM d +H:mm:ss +d MMMM +1 дүгээр сарын,2 дугаар сарын,3 дугаар сарын,4 дүгээр сарын,5 дугаар сарын,6 дугаар сарын,7 дугаар сарын,8 дугаар сарын,9 дүгээр сарын,10 дугаар сарын,11 дүгээр сарын,12 дугаар сарын, +1 дүгээр сар,2 дугаар сар,3 дугаар сар,4 дүгээр сар,5 дугаар сар,6 дугаар сар,7 дугаар сар,8 дугаар сар,9 дүгээр сар,10 дугаар сар,11 дүгээр сар,12 дугаар сар, +Грегорийн он тоолол +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yy.MM.dd +Ня,Да,Мя,Лх,Пү,Ба,Бя +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +yyyy 'он' MMMM diff --git a/dna/Cultures/mr b/dna/Cultures/mr new file mode 100644 index 0000000..bce10a3 --- /dev/null +++ b/dna/Cultures/mr @@ -0,0 +1,20 @@ +mr +0x004e + +Marathi +मराठी +Marathi +mr +mar +MAR +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +mr +True +0 +500 +False +, +2 +1 diff --git a/dna/Cultures/mr-IN b/dna/Cultures/mr-IN new file mode 100644 index 0000000..1c55a6a --- /dev/null +++ b/dna/Cultures/mr-IN @@ -0,0 +1,72 @@ +mr-IN +0x044e +mr +Marathi (India) +मराठी (भारत) +Marathi (India) +mr +mar +MAR +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +mr-IN +False +0 +500 +False +, +2 +1 +2 +. +, +3,2 +12 +2 +रु +1 +NaN +०,१,२,३,४,५,६,७,८,९ +-Infinity +- +2 +. +, +3,2 +1 +2 +. +, +3,2 +0 +0 +% +‰ +Infinity ++ +रवि.,सोम.,मंगळ.,बुध.,गुरु.,शुक्र.,शनि. +जाने.,फेब्रु.,मार्च,एप्रिल,मे,जून,जुलै,ऑगस्ट,सप्टें.,ऑक्टो.,नोव्हें.,डिसें., +जाने.,फेब्रु.,मार्च,एप्रिल,मे,जून,जुलै,ऑगस्ट,सप्टें.,ऑक्टो.,नोव्हें.,डिसें., +म.पू. +0 +- +रविवार,सोमवार,मंगळवार,बुधवार,गुरुवार,शुक्रवार,शनिवार +1 +dd MMMM yyyy HH:mm:ss +dd MMMM yyyy +HH:mm:ss +dd MMMM +जानेवारी,फेब्रुवारी,मार्च,एप्रिल,मे,जून,जुलै,ऑगस्ट,सप्टेंबर,ऑक्टोबर,नोव्हेंबर,डिसेंबर, +जानेवारी,फेब्रुवारी,मार्च,एप्रिल,मे,जून,जुलै,ऑगस्ट,सप्टेंबर,ऑक्टोबर,नोव्हेंबर,डिसेंबर, +इंग्रजी कॅलेन्डर +HH:mm:ss +म.नं. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yyyy +र,स,म,ब,ग,श,श +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ms b/dna/Cultures/ms new file mode 100644 index 0000000..6241718 --- /dev/null +++ b/dna/Cultures/ms @@ -0,0 +1,20 @@ +ms +0x003e + +Malay +Bahasa Malaysia +Malay +ms +msa +MSL +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +ms +True +1252 +500 +False +; +10000 +850 diff --git a/dna/Cultures/ms-BN b/dna/Cultures/ms-BN new file mode 100644 index 0000000..1b6e1bd --- /dev/null +++ b/dna/Cultures/ms-BN @@ -0,0 +1,72 @@ +ms-BN +0x083e +ms +Malay (Brunei Darussalam) +Bahasa Malaysia (Brunei Darussalam) +Malay (Brunei Darussalam) +ms +msa +MSB +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +ms-BN +False +1252 +500 +False +; +10000 +850 +0 +, +. +3 +0 +0 +$ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinity ++ +Ahad,Isnin,Sel,Rabu,Khamis,Jumaat,Sabtu +Jan,Feb,Mac,Apr,Mei,Jun,Jul,Ogos,Sept,Okt,Nov,Dis, +Jan,Feb,Mac,Apr,Mei,Jun,Jul,Ogos,Sept,Okt,Nov,Dis, + +0 +/ +Ahad,Isnin,Selasa,Rabu,Khamis,Jumaat,Sabtu +1 +dd MMMM yyyy H:mm:ss +dd MMMM yyyy +H:mm:ss +dd MMMM +Januari,Februari,Mac,April,Mei,Jun,Julai,Ogos,September,Oktober,November,Disember, +Januari,Februari,Mac,April,Mei,Jun,Julai,Ogos,September,Oktober,November,Disember, +kalendar Masehi +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +A,I,S,R,K,J,S +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/ms-MY b/dna/Cultures/ms-MY new file mode 100644 index 0000000..45f9730 --- /dev/null +++ b/dna/Cultures/ms-MY @@ -0,0 +1,72 @@ +ms-MY +0x043e +ms +Malay (Malaysia) +Bahasa Malaysia (Malaysia) +Malay (Malaysia) +ms +msa +MSL +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +ms-MY +False +1252 +500 +False +; +10000 +850 +0 +, +. +3 +0 +0 +R +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinity ++ +Ahad,Isnin,Sel,Rabu,Khamis,Jumaat,Sabtu +Jan,Feb,Mac,Apr,Mei,Jun,Jul,Ogos,Sept,Okt,Nov,Dis, +Jan,Feb,Mac,Apr,Mei,Jun,Jul,Ogos,Sept,Okt,Nov,Dis, + +0 +/ +Ahad,Isnin,Selasa,Rabu,Khamis,Jumaat,Sabtu +1 +dd MMMM yyyy H:mm:ss +dd MMMM yyyy +H:mm:ss +dd MMMM +Januari,Februari,Mac,April,Mei,Jun,Julai,Ogos,September,Oktober,November,Disember, +Januari,Februari,Mac,April,Mei,Jun,Julai,Ogos,September,Oktober,November,Disember, +kalendar Masehi +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +A,I,S,R,K,J,S +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/mt-MT b/dna/Cultures/mt-MT new file mode 100644 index 0000000..ff45269 --- /dev/null +++ b/dna/Cultures/mt-MT @@ -0,0 +1,72 @@ +mt-MT +0x043a + +Maltese (Malta) +Malti (Malta) +Maltese +mt +mt +MLT +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +mt-MT +False +0 +500 +False +, +2 +1 +2 +. +, +3 +1 +0 +Lm +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Ħad,Tne,Tli,Erb,Ħam,Ġim,Sib +Jan,Fra,Mar,Apr,Mej,Ġun,Lul,Awi,Set,Ott,Nov,Diċ, +Jan,Fra,Mar,Apr,Mej,Ġun,Lul,Awi,Set,Ott,Nov,Diċ, +AM +0 +/ +Il-Ħadd,It-Tnejn,It-Tlieta,L-Erbgħa,Il-Ħamis,Il-Ġimgħa,Is-Sibt +1 +dddd, d' ta\' 'MMMM yyyy HH:mm:ss +dddd, d' ta\' 'MMMM yyyy +HH:mm:ss +MMMM dd +Jannar,Frar,Marzu,April,Mejju,Ġunju,Lulju,Awissu,Settembru,Ottubru,Novembru,Diċembru, +Jannar,Frar,Marzu,April,Mejju,Ġunju,Lulju,Awissu,Settembru,Ottubru,Novembru,Diċembru, +Kalendarju +HH:mm:ss +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +Ħad,Tne,Tli,Erb,Ħam,Ġim,Sib +HH:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/nb-NO b/dna/Cultures/nb-NO new file mode 100644 index 0000000..d54d4ba --- /dev/null +++ b/dna/Cultures/nb-NO @@ -0,0 +1,72 @@ +nb-NO +0x0414 +no +Norwegian, Bokmål (Norway) +norsk, bokmål (Norge) +Norwegian, Bokmål (Norway) +nb +nob +NOR +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +nb-NO +False +1252 +20277 +False +; +10000 +850 +2 +, +  +3 +12 +2 +kr +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-INF +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +INF ++ +sø,ma,ti,on,to,fr,lø +jan,feb,mar,apr,mai,jun,jul,aug,sep,okt,nov,des, +jan,feb,mar,apr,mai,jun,jul,aug,sep,okt,nov,des, + +2 +. +søndag,mandag,tirsdag,onsdag,torsdag,fredag,lørdag +1 +d. MMMM yyyy HH:mm:ss +d. MMMM yyyy +HH:mm:ss +d. MMMM +januar,februar,mars,april,mai,juni,juli,august,september,oktober,november,desember, +januar,februar,mars,april,mai,juni,juli,august,september,oktober,november,desember, +gregoriansk kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +sø,ma,ti,on,to,fr,lø +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/nl b/dna/Cultures/nl new file mode 100644 index 0000000..b4f3499 --- /dev/null +++ b/dna/Cultures/nl @@ -0,0 +1,20 @@ +nl +0x0013 + +Dutch +Nederlands +Dutch +nl +nld +NLD +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +nl +True +1252 +500 +False +; +10000 +850 diff --git a/dna/Cultures/nl-BE b/dna/Cultures/nl-BE new file mode 100644 index 0000000..ac67f0a --- /dev/null +++ b/dna/Cultures/nl-BE @@ -0,0 +1,72 @@ +nl-BE +0x0813 +nl +Dutch (Belgium) +Nederlands (België) +Dutch (Belgium) +nl +nld +NLB +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +nl-BE +False +1252 +500 +False +; +10000 +850 +2 +, +. +3 +12 +2 +€ +1 +NaN (Niet-een-getal) +0,1,2,3,4,5,6,7,8,9 +-oneindig +- +2 +, +. +3 +1 +2 +, +. +3 +1 +1 +% +‰ +oneindig ++ +zo,ma,di,wo,do,vr,za +jan,feb,mrt,apr,mei,jun,jul,aug,sep,okt,nov,dec, +jan,feb,mrt,apr,mei,jun,jul,aug,sep,okt,nov,dec, + +0 +/ +zondag,maandag,dinsdag,woensdag,donderdag,vrijdag,zaterdag +1 +dddd d MMMM yyyy H:mm:ss +dddd d MMMM yyyy +H:mm:ss +dd MMMM +januari,februari,maart,april,mei,juni,juli,augustus,september,oktober,november,december, +januari,februari,maart,april,mei,juni,juli,augustus,september,oktober,november,december, +Gregoriaanse kalender +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d/MM/yyyy +zo,ma,di,wo,do,vr,za +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/nl-NL b/dna/Cultures/nl-NL new file mode 100644 index 0000000..b244625 --- /dev/null +++ b/dna/Cultures/nl-NL @@ -0,0 +1,72 @@ +nl-NL +0x0413 +nl +Dutch (Netherlands) +Nederlands (Nederland) +Dutch (Netherlands) +nl +nld +NLD +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +nl-NL +False +1252 +500 +False +; +10000 +850 +2 +, +. +3 +12 +2 +€ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinity ++ +zo,ma,di,wo,do,vr,za +jan,feb,mrt,apr,mei,jun,jul,aug,sep,okt,nov,dec, +jan,feb,mrt,apr,mei,jun,jul,aug,sep,okt,nov,dec, + +2 +- +zondag,maandag,dinsdag,woensdag,donderdag,vrijdag,zaterdag +1 +dddd d MMMM yyyy H:mm:ss +dddd d MMMM yyyy +H:mm:ss +dd MMMM +januari,februari,maart,april,mei,juni,juli,augustus,september,oktober,november,december, +januari,februari,maart,april,mei,juni,juli,augustus,september,oktober,november,december, +Gregoriaanse kalender +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d-M-yyyy +zo,ma,di,wo,do,vr,za +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/nn-NO b/dna/Cultures/nn-NO new file mode 100644 index 0000000..27ae2c9 --- /dev/null +++ b/dna/Cultures/nn-NO @@ -0,0 +1,72 @@ +nn-NO +0x0814 +no +Norwegian, Nynorsk (Norway) +norsk, nynorsk (Noreg) +Norwegian, Nynorsk (Norway) +nn +nno +NON +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +nn-NO +False +1252 +20277 +False +; +10000 +850 +2 +, +  +3 +12 +2 +kr +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-INF +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +INF ++ +sø,må,ty,on,to,fr,la +jan,feb,mar,apr,mai,jun,jul,aug,sep,okt,nov,des, +jan,feb,mar,apr,mai,jun,jul,aug,sep,okt,nov,des, + +2 +. +søndag,måndag,tysdag,onsdag,torsdag,fredag,laurdag +1 +d. MMMM yyyy HH:mm:ss +d. MMMM yyyy +HH:mm:ss +d. MMMM +januar,februar,mars,april,mai,juni,juli,august,september,oktober,november,desember, +januar,februar,mars,april,mai,juni,juli,august,september,oktober,november,desember, +gregoriansk kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +sø,må,ty,on,to,fr,la +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/no b/dna/Cultures/no new file mode 100644 index 0000000..762c07f --- /dev/null +++ b/dna/Cultures/no @@ -0,0 +1,20 @@ +no +0x0014 + +Norwegian +norsk +Norwegian +no +nor +NOR +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +no +True +1252 +20277 +False +; +10000 +850 diff --git a/dna/Cultures/ns-ZA b/dna/Cultures/ns-ZA new file mode 100644 index 0000000..044828a --- /dev/null +++ b/dna/Cultures/ns-ZA @@ -0,0 +1,72 @@ +ns-ZA +0x046c + +Northern Sotho (South Africa) +Sesotho sa Leboa (Afrika Borwa) +Northern Sotho +ns +ns +NSO +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +ns-ZA +False +1252 +500 +False +, +10000 +850 +2 +. +, +3 +2 +2 +R +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +Lamorena,Mošupologo,Labobedi,Laboraro,Labone,Labohlano,Mokibelo +0 +dd MMMM yyyy hh:mm:ss tt +dd MMMM yyyy +hh:mm:ss tt +MMMM dd +Pherekgong,Hlakola,Mopitlo,Moranang,Mosegamanye,Ngoatobošego,Phuphu,Phato,Lewedi,Diphalana,Dibatsela,Manthole, +Pherekgong,Hlakola,Mopitlo,Moranang,Mosegamanye,Ngoatobošego,Phuphu,Phato,Lewedi,Diphalana,Dibatsela,Manthole, +Gregorian Calendar +hh:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy/MM/dd +Sun,Mon,Tue,Wed,Thu,Fri,Sat +hh:mm:ss tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/pa b/dna/Cultures/pa new file mode 100644 index 0000000..8f2a2b6 --- /dev/null +++ b/dna/Cultures/pa @@ -0,0 +1,20 @@ +pa +0x0046 + +Punjabi +ਪੰਜਾਬੀ +Punjabi +pa +pan +PAN +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +pa +True +0 +500 +False +, +2 +1 diff --git a/dna/Cultures/pa-IN b/dna/Cultures/pa-IN new file mode 100644 index 0000000..26bde85 --- /dev/null +++ b/dna/Cultures/pa-IN @@ -0,0 +1,72 @@ +pa-IN +0x0446 +pa +Punjabi (India) +ਪੰਜਾਬੀ (ਭਾਰਤ) +Punjabi (India) +pa +pan +PAN +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +pa-IN +False +0 +500 +False +, +2 +1 +2 +. +, +3,2 +12 +2 +ਰੁ +1 +NaN +੦,੧,੨,੩,੪,੫,੬,੭,੮,੯ +-Infinity +- +2 +. +, +3,2 +1 +2 +. +, +3,2 +0 +0 +% +‰ +Infinity ++ +ਐਤ.,ਸੋਮ.,ਮੰਗਲ.,ਬੁਧ.,ਵੀਰ.,ਸ਼ੁਕਰ.,ਸ਼ਨੀ. +ਜਨਵਰੀ,ਫ਼ਰਵਰੀ,ਮਾਰਚ,ਅਪ੍ਰੈਲ,ਮਈ,ਜੂਨ,ਜੁਲਾਈ,ਅਗਸਤ,ਸਤੰਬਰ,ਅਕਤੂਬਰ,ਨਵੰਬਰ,ਦਸੰਬਰ, +ਜਨਵਰੀ,ਫ਼ਰਵਰੀ,ਮਾਰਚ,ਅਪ੍ਰੈਲ,ਮਈ,ਜੂਨ,ਜੁਲਾਈ,ਅਗਸਤ,ਸਤੰਬਰ,ਅਕਤੂਬਰ,ਨਵੰਬਰ,ਦਸੰਬਰ, +ਸਵੇਰੇ +0 +- +ਐਤਵਾਰ,ਸੋਮਵਾਰ,ਮੰਗਲਵਾਰ,ਬੁਧਵਾਰ,ਵੀਰਵਾਰ,ਸ਼ੁੱਕਰਵਾਰ,ਸ਼ਨੀਚਰਵਾਰ +1 +dd MMMM yyyy dddd tt hh:mm:ss +dd MMMM yyyy dddd +tt hh:mm:ss +dd MMMM +ਜਨਵਰੀ,ਫ਼ਰਵਰੀ,ਮਾਰਚ,ਅਪ੍ਰੈਲ,ਮਈ,ਜੂਨ,ਜੁਲਾਈ,ਅਗਸਤ,ਸਤੰਬਰ,ਅਕਤੂਬਰ,ਨਵੰਬਰ,ਦਸੰਬਰ, +ਜਨਵਰੀ,ਫ਼ਰਵਰੀ,ਮਾਰਚ,ਅਪ੍ਰੈਲ,ਮਈ,ਜੂਨ,ਜੁਲਾਈ,ਅਗਸਤ,ਸਤੰਬਰ,ਅਕਤੂਬਰ,ਨਵੰਬਰ,ਦਸੰਬਰ, +ਅੰਗ੍ਰੇਜ਼ੀ ਕਲੰਡਰ +tt hh:mm:ss +ਸ਼ਾਮ +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yy +ਐ,ਸ,ਮ,ਬ,ਵ,ਸ਼,ਸ਼ +tt hh:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/pl b/dna/Cultures/pl new file mode 100644 index 0000000..2b0885e --- /dev/null +++ b/dna/Cultures/pl @@ -0,0 +1,20 @@ +pl +0x0015 + +Polish +polski +Polish +pl +pol +PLK +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +pl +True +1250 +20880 +False +; +10029 +852 diff --git a/dna/Cultures/pl-PL b/dna/Cultures/pl-PL new file mode 100644 index 0000000..5f92c39 --- /dev/null +++ b/dna/Cultures/pl-PL @@ -0,0 +1,72 @@ +pl-PL +0x0415 +pl +Polish (Poland) +polski (Polska) +Polish (Poland) +pl +pol +PLK +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +pl-PL +False +1250 +20880 +False +; +10029 +852 +2 +, +  +3 +8 +3 +zł +1 +nie jest liczbą +0,1,2,3,4,5,6,7,8,9 +-nieskończoność +- +2 +, +  +3 +1 +2 +, +  +3 +1 +1 +% +‰ ++nieskończoność ++ +N,Pn,Wt,Śr,Cz,Pt,So +sty,lut,mar,kwi,maj,cze,lip,sie,wrz,paź,lis,gru, +sty,lut,mar,kwi,maj,cze,lip,sie,wrz,paź,lis,gru, + +2 +- +niedziela,poniedziałek,wtorek,środa,czwartek,piątek,sobota +1 +d MMMM yyyy HH:mm:ss +d MMMM yyyy +HH:mm:ss +d MMMM +stycznia,lutego,marca,kwietnia,maja,czerwca,lipca,sierpnia,września,października,listopada,grudnia, +styczeń,luty,marzec,kwiecień,maj,czerwiec,lipiec,sierpień,wrzesień,październik,listopad,grudzień, +Kalendarz gregoriański +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy-MM-dd +N,Pn,Wt,Śr,Cz,Pt,So +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/pt b/dna/Cultures/pt new file mode 100644 index 0000000..88b52d1 --- /dev/null +++ b/dna/Cultures/pt @@ -0,0 +1,20 @@ +pt +0x0016 + +Portuguese +Português +Portuguese +pt +por +PTB +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +pt +True +1252 +500 +False +; +10000 +850 diff --git a/dna/Cultures/pt-BR b/dna/Cultures/pt-BR new file mode 100644 index 0000000..45d2965 --- /dev/null +++ b/dna/Cultures/pt-BR @@ -0,0 +1,72 @@ +pt-BR +0x0416 +pt +Portuguese (Brazil) +Português (Brasil) +Portuguese (Brazil) +pt +por +PTB +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +pt-BR +False +1252 +500 +False +; +10000 +850 +2 +, +. +3 +9 +2 +R$ +1 +NaN (Não é um número) +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +, +. +3 +1 +2 +, +. +3 +1 +1 +% +‰ ++Infinito ++ +dom,seg,ter,qua,qui,sex,sáb +jan,fev,mar,abr,mai,jun,jul,ago,set,out,nov,dez, +jan,fev,mar,abr,mai,jun,jul,ago,set,out,nov,dez, + +0 +/ +domingo,segunda-feira,terça-feira,quarta-feira,quinta-feira,sexta-feira,sábado +0 +dddd, d' de 'MMMM' de 'yyyy H:mm:ss +dddd, d' de 'MMMM' de 'yyyy +H:mm:ss +dd' de 'MMMM +janeiro,fevereiro,março,abril,maio,junho,julho,agosto,setembro,outubro,novembro,dezembro, +janeiro,fevereiro,março,abril,maio,junho,julho,agosto,setembro,outubro,novembro,dezembro, +Calendário gregoriano +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d/M/yyyy +dom,seg,ter,qua,qui,sex,sáb +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/pt-PT b/dna/Cultures/pt-PT new file mode 100644 index 0000000..5e99294 --- /dev/null +++ b/dna/Cultures/pt-PT @@ -0,0 +1,72 @@ +pt-PT +0x0816 +pt +Portuguese (Portugal) +português (Portugal) +Portuguese (Portugal) +pt +por +PTG +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +pt-PT +False +1252 +500 +False +; +10000 +850 +2 +, +. +3 +8 +3 +€ +1 +NaN (Não é um número) +0,1,2,3,4,5,6,7,8,9 +-Infinito +- +2 +, +. +3 +1 +2 +, +. +3 +1 +1 +% +‰ ++Infinito ++ +dom,seg,ter,qua,qui,sex,sáb +Jan,Fev,Mar,Abr,Mai,Jun,Jul,Ago,Set,Out,Nov,Dez, +Jan,Fev,Mar,Abr,Mai,Jun,Jul,Ago,Set,Out,Nov,Dez, + +0 +- +domingo,segunda-feira,terça-feira,quarta-feira,quinta-feira,sexta-feira,sábado +1 +dddd, d' de 'MMMM' de 'yyyy H:mm:ss +dddd, d' de 'MMMM' de 'yyyy +H:mm:ss +d/M +Janeiro,Fevereiro,Março,Abril,Maio,Junho,Julho,Agosto,Setembro,Outubro,Novembro,Dezembro, +Janeiro,Fevereiro,Março,Abril,Maio,Junho,Julho,Agosto,Setembro,Outubro,Novembro,Dezembro, +Calendário gregoriano +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yyyy +dom,seg,ter,qua,qui,sex,sáb +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/quz-BO b/dna/Cultures/quz-BO new file mode 100644 index 0000000..683e17a --- /dev/null +++ b/dna/Cultures/quz-BO @@ -0,0 +1,72 @@ +quz-BO +0x046b + +Quechua (Bolivia) +runasimi (Bolivia Suyu) +Quechua (Bolivia) +quz +quz +QUB +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +quz-BO +False +1252 +20284 +False +, +10000 +850 +2 +, +. +3 +14 +2 +$b +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinity ++ +int,kil,ati,quy,Ch’,Ill,k'u +Qul,Hat,Pau,ayr,Aym,Int,Ant,Qha,Uma,Kan,Aya,Kap, +Qul,Hat,Pau,ayr,Aym,Int,Ant,Qha,Uma,Kan,Aya,Kap, +a.m. +0 +/ +intichaw,killachaw,atipachaw,quyllurchaw,Ch' askachaw,Illapachaw,k'uychichaw +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +MMMM dd +Qulla puquy,Hatun puquy,Pauqar waray,ayriwa,Aymuray,Inti raymi,Anta Sitwa,Qhapaq Sitwa,Uma raymi,Kantaray,Ayamarq'a,Kapaq Raymi, +Qulla puquy,Hatun puquy,Pauqar waray,ayriwa,Aymuray,Inti raymi,Anta Sitwa,Qhapaq Sitwa,Uma raymi,Kantaray,Ayamarq'a,Kapaq Raymi, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +int,kil,ati,quy,Ch’,Ill,k'u +hh:mm:ss tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/quz-EC b/dna/Cultures/quz-EC new file mode 100644 index 0000000..1fbbf12 --- /dev/null +++ b/dna/Cultures/quz-EC @@ -0,0 +1,72 @@ +quz-EC +0x086b + +Quechua (Ecuador) +runasimi (Ecuador Suyu) +Quechua (Ecuador) +quz +quz +QUE +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +quz-EC +False +1252 +20284 +False +, +10000 +850 +2 +, +. +3 +14 +2 +$ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinity ++ +int,kil,ati,quy,Ch’,Ill,k'u +Qul,Hat,Pau,ayr,Aym,Int,Ant,Qha,Uma,Kan,Aya,Kap, +Qul,Hat,Pau,ayr,Aym,Int,Ant,Qha,Uma,Kan,Aya,Kap, + +0 +/ +intichaw,killachaw,atipachaw,quyllurchaw,Ch' askachaw,Illapachaw,k'uychichaw +0 +dddd, dd' de 'MMMM' de 'yyyy H:mm:ss +dddd, dd' de 'MMMM' de 'yyyy +H:mm:ss +MMMM dd +Qulla puquy,Hatun puquy,Pauqar waray,ayriwa,Aymuray,Inti raymi,Anta Sitwa,Qhapaq Sitwa,Uma raymi,Kantaray,Ayamarq'a,Kapaq Raymi, +Qulla puquy,Hatun puquy,Pauqar waray,ayriwa,Aymuray,Inti raymi,Anta Sitwa,Qhapaq Sitwa,Uma raymi,Kantaray,Ayamarq'a,Kapaq Raymi, +calendario gregoriano +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +int,kil,ati,quy,Ch’,Ill,k'u +H:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/quz-PE b/dna/Cultures/quz-PE new file mode 100644 index 0000000..bc1bac1 --- /dev/null +++ b/dna/Cultures/quz-PE @@ -0,0 +1,72 @@ +quz-PE +0x0c6b + +Quechua (Peru) +runasimi (Peru Suyu) +Quechua (Peru) +quz +quz +QUP +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +quz-PE +False +1252 +20284 +False +, +10000 +850 +2 +. +, +3 +12 +2 +S/. +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinity ++ +int,kil,ati,quy,Ch’,Ill,k'u +Qul,Hat,Pau,ayr,Aym,Int,Ant,Qha,Uma,Kan,Aya,Kap, +Qul,Hat,Pau,ayr,Aym,Int,Ant,Qha,Uma,Kan,Aya,Kap, +a.m. +0 +/ +intichaw,killachaw,atipachaw,quyllurchaw,Ch' askachaw,Illapachaw,k'uychichaw +0 +dddd, dd' de 'MMMM' de 'yyyy hh:mm:ss tt +dddd, dd' de 'MMMM' de 'yyyy +hh:mm:ss tt +MMMM dd +Qulla puquy,Hatun puquy,Pauqar waray,ayriwa,Aymuray,Inti raymi,Anta Sitwa,Qhapaq Sitwa,Uma raymi,Kantaray,Ayamarq'a,Kapaq Raymi, +Qulla puquy,Hatun puquy,Pauqar waray,ayriwa,Aymuray,Inti raymi,Anta Sitwa,Qhapaq Sitwa,Uma raymi,Kantaray,Ayamarq'a,Kapaq Raymi, +calendario gregoriano +hh:mm:ss tt +p.m. +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +int,kil,ati,quy,Ch’,Ill,k'u +hh:mm:ss tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM' de 'yyyy diff --git a/dna/Cultures/ro b/dna/Cultures/ro new file mode 100644 index 0000000..16377fd --- /dev/null +++ b/dna/Cultures/ro @@ -0,0 +1,20 @@ +ro +0x0018 + +Romanian +română +Romanian +ro +ron +ROM +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +ro +True +1250 +20880 +False +; +10029 +852 diff --git a/dna/Cultures/ro-RO b/dna/Cultures/ro-RO new file mode 100644 index 0000000..df3b31f --- /dev/null +++ b/dna/Cultures/ro-RO @@ -0,0 +1,72 @@ +ro-RO +0x0418 +ro +Romanian (Romania) +română (România) +Romanian (Romania) +ro +ron +ROM +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +ro-RO +False +1250 +20880 +False +; +10029 +852 +2 +, +. +3 +8 +3 +lei +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +1 +2 +, +. +3 +1 +1 +% +‰ +Infinity ++ +D,L,Ma,Mi,J,V,S +ian.,feb.,mar.,apr.,mai.,iun.,iul.,aug.,sep.,oct.,nov.,dec., +ian.,feb.,mar.,apr.,mai.,iun.,iul.,aug.,sep.,oct.,nov.,dec., + +0 +. +duminică,luni,marţi,miercuri,joi,vineri,sâmbătă +1 +d MMMM yyyy HH:mm:ss +d MMMM yyyy +HH:mm:ss +d MMMM +ianuarie,februarie,martie,aprilie,mai,iunie,iulie,august,septembrie,octombrie,noiembrie,decembrie, +ianuarie,februarie,martie,aprilie,mai,iunie,iulie,august,septembrie,octombrie,noiembrie,decembrie, +calendar Gregorian +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +D,L,Ma,Mi,J,V,S +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/ru b/dna/Cultures/ru new file mode 100644 index 0000000..bc668c0 --- /dev/null +++ b/dna/Cultures/ru @@ -0,0 +1,20 @@ +ru +0x0019 + +Russian +русский +Russian +ru +rus +RUS +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +ru +True +1251 +20880 +False +; +10007 +866 diff --git a/dna/Cultures/ru-RU b/dna/Cultures/ru-RU new file mode 100644 index 0000000..4afdf30 --- /dev/null +++ b/dna/Cultures/ru-RU @@ -0,0 +1,72 @@ +ru-RU +0x0419 +ru +Russian (Russia) +русский (Россия) +Russian (Russia) +ru +rus +RUS +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +ru-RU +False +1251 +20880 +False +; +10007 +866 +2 +, +  +3 +5 +1 +р. +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-бесконечность +- +2 +, +  +3 +1 +2 +, +  +3 +1 +1 +% +‰ +бесконечность ++ +Вс,Пн,Вт,Ср,Чт,Пт,Сб +янв,фев,мар,апр,май,июн,июл,авг,сен,окт,ноя,дек, +янв,фев,мар,апр,май,июн,июл,авг,сен,окт,ноя,дек, + +0 +. +воскресенье,понедельник,вторник,среда,четверг,пятница,суббота +1 +d MMMM yyyy 'г.' H:mm:ss +d MMMM yyyy 'г.' +H:mm:ss +MMMM dd +января,февраля,марта,апреля,мая,июня,июля,августа,сентября,октября,ноября,декабря, +Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь, +григорианский календарь +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +Вс,Пн,Вт,Ср,Чт,Пт,Сб +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy 'г.' diff --git a/dna/Cultures/sa b/dna/Cultures/sa new file mode 100644 index 0000000..8c5866b --- /dev/null +++ b/dna/Cultures/sa @@ -0,0 +1,20 @@ +sa +0x004f + +Sanskrit +संस्कृत +Sanskrit +sa +san +SAN +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +sa +True +0 +500 +False +, +2 +1 diff --git a/dna/Cultures/sa-IN b/dna/Cultures/sa-IN new file mode 100644 index 0000000..250d5c1 --- /dev/null +++ b/dna/Cultures/sa-IN @@ -0,0 +1,72 @@ +sa-IN +0x044f +sa +Sanskrit (India) +संस्कृत (भारतम्) +Sanskrit (India) +sa +san +SAN +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +sa-IN +False +0 +500 +False +, +2 +1 +2 +. +, +3,2 +12 +2 +रु +1 +NaN +०,१,२,३,४,५,६,७,८,९ +-Infinity +- +2 +. +, +3,2 +1 +2 +. +, +3,2 +0 +0 +% +‰ +Infinity ++ +रविवासरः,सोमवासरः,मङ्गलवासरः,बुधवासरः,गुरुवासरः,शुक्रवासरः,शनिवासरः +जनवरी,फरवरी,मार्च,अप्रैल,मई,जून,जुलाई,अगस्त,सितम्बर,अक्तूबर,नवम्बर,दिसम्बर, +जनवरी,फरवरी,मार्च,अप्रैल,मई,जून,जुलाई,अगस्त,सितम्बर,अक्तूबर,नवम्बर,दिसम्बर, +पूर्वाह्न +0 +- +रविवासरः,सोमवासरः,मङ्गलवासरः,बुधवासरः,गुरुवासरः,शुक्रवासरः,शनिवासरः +0 +dd MMMM yyyy dddd HH:mm:ss +dd MMMM yyyy dddd +HH:mm:ss +dd MMMM +जनवरी,फरवरी,मार्च,अप्रैल,मई,जून,जुलाई,अगस्त,सितम्बर,अक्तूबर,नवम्बर,दिसम्बर, +जनवरी,फरवरी,मार्च,अप्रैल,मई,जून,जुलाई,अगस्त,सितम्बर,अक्तूबर,नवम्बर,दिसम्बर, +ख्रिस्ताब्द पञ्जिका +HH:mm:ss +अपराह्न +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yyyy +र,स,म,ब,ग,श,श +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/se-FI b/dna/Cultures/se-FI new file mode 100644 index 0000000..af2c0ff --- /dev/null +++ b/dna/Cultures/se-FI @@ -0,0 +1,72 @@ +se-FI +0x0c3b + +Sami (Northern) (Finland) +davvisámegiella (Suopma) +Sami, Northern (Finland) +se +se +SMG +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +se-FI +False +1252 +20278 +False +; +10000 +850 +2 +, +  +3 +8 +3 +€ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +Infinity ++ +sotn,vuos,maŋ,gask,duor,bear,láv +ođđj,guov,njuk,cuo,mies,geas,suoi,borg,čakč,golg,skáb,juov, +ođđj,guov,njuk,cuo,mies,geas,suoi,borg,čakč,golg,skáb,juov, + +2 +. +sotnabeaivi,vuossárga,maŋŋebárga,gaskavahkku,duorastat,bearjadat,lávvardat +1 +MMMM d'. b. 'yyyy H:mm:ss +MMMM d'. b. 'yyyy +H:mm:ss +MMMM dd +ođđajagemánu,guovvamánu,njukčamánu,cuoŋománu,miessemánu,geassemánu,suoidnemánu,borgemánu,čakčamánu,golggotmánu,skábmamánu,juovlamánu, +ođđajagemánnu,guovvamánnu,njukčamánnu,cuoŋománnu,miessemánnu,geassemánnu,suoidnemánnu,borgemánnu,čakčamánnu,golggotmánnu,skábmamánnu,juovlamánnu, +gregoriaaninen kalenteri +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.M.yyyy +sotn,vuos,maŋ,gask,duor,bear,láv +H:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/se-NO b/dna/Cultures/se-NO new file mode 100644 index 0000000..1f1c643 --- /dev/null +++ b/dna/Cultures/se-NO @@ -0,0 +1,72 @@ +se-NO +0x043b + +Sami (Northern) (Norway) +davvisámegiella (Norga) +Sami, Northern (Norway) +se +se +SME +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +se-NO +False +1252 +20277 +False +; +10000 +850 +2 +, +  +3 +12 +2 +kr +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +Infinity ++ +sotn,vuos,maŋ,gask,duor,bear,láv +ođđj,guov,njuk,cuo,mies,geas,suoi,borg,čakč,golg,skáb,juov, +ođđj,guov,njuk,cuo,mies,geas,suoi,borg,čakč,golg,skáb,juov, + +2 +. +sotnabeaivi,vuossárga,maŋŋebárga,gaskavahkku,duorastat,bearjadat,lávvardat +1 +MMMM d'. b. 'yyyy HH:mm:ss +MMMM d'. b. 'yyyy +HH:mm:ss +MMMM dd +ođđajagemánu,guovvamánu,njukčamánu,cuoŋománu,miessemánu,geassemánu,suoidnemánu,borgemánu,čakčamánu,golggotmánu,skábmamánu,juovlamánu, +ođđajagemánnu,guovvamánnu,njukčamánnu,cuoŋománnu,miessemánnu,geassemánnu,suoidnemánnu,borgemánnu,čakčamánnu,golggotmánnu,skábmamánnu,juovlamánnu, +gregoriansk kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +sotn,vuos,maŋ,gask,duor,bear,láv +HH:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/se-SE b/dna/Cultures/se-SE new file mode 100644 index 0000000..111865f --- /dev/null +++ b/dna/Cultures/se-SE @@ -0,0 +1,72 @@ +se-SE +0x083b + +Sami (Northern) (Sweden) +davvisámegiella (Ruoŧŧa) +Sami, Northern (Sweden) +se +se +SMF +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +se-SE +False +1252 +20278 +False +; +10000 +850 +2 +, +. +3 +8 +3 +kr +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +Infinity ++ +sotn,mán,dis,gask,duor,bear,láv +ođđj,guov,njuk,cuo,mies,geas,suoi,borg,čakč,golg,skáb,juov, +ođđj,guov,njuk,cuo,mies,geas,suoi,borg,čakč,golg,skáb,juov, + +2 +- +sotnabeaivi,mánnodat,disdat,gaskavahkku,duorastat,bearjadat,lávvardat +1 +MMMM d'. b. 'yyyy HH:mm:ss +MMMM d'. b. 'yyyy +HH:mm:ss +MMMM dd +ođđajagemánu,guovvamánu,njukčamánu,cuoŋománu,miessemánu,geassemánu,suoidnemánu,borgemánu,čakčamánu,golggotmánu,skábmamánu,juovlamánu, +ođđajagemánnu,guovvamánnu,njukčamánnu,cuoŋománnu,miessemánnu,geassemánnu,suoidnemánnu,borgemánnu,čakčamánnu,golggotmánnu,skábmamánnu,juovlamánnu, +gregoriansk kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy-MM-dd +sotn,mán,dis,gask,duor,bear,láv +HH:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/sk b/dna/Cultures/sk new file mode 100644 index 0000000..5dd5731 --- /dev/null +++ b/dna/Cultures/sk @@ -0,0 +1,20 @@ +sk +0x001b + +Slovak +slovenčina +Slovak +sk +slk +SKY +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +sk +True +1250 +20880 +False +; +10029 +852 diff --git a/dna/Cultures/sk-SK b/dna/Cultures/sk-SK new file mode 100644 index 0000000..f4c1590 --- /dev/null +++ b/dna/Cultures/sk-SK @@ -0,0 +1,72 @@ +sk-SK +0x041b +sk +Slovak (Slovakia) +slovenčina (Slovenská republika) +Slovak (Slovakia) +sk +slk +SKY +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +sk-SK +False +1250 +20880 +False +; +10029 +852 +2 +, +  +3 +8 +3 +Sk +1 +Nie je číslo +0,1,2,3,4,5,6,7,8,9 +-nekonečno +- +2 +, +  +3 +1 +2 +, +  +3 +1 +1 +% +‰ ++nekonečno ++ +ne,po,ut,st,št,pi,so +I,II,III,IV,V,VI,VII,VIII,IX,X,XI,XII, +I,II,III,IV,V,VI,VII,VIII,IX,X,XI,XII, + +0 +. +nedeľa,pondelok,utorok,streda,štvrtok,piatok,sobota +1 +d. MMMM yyyy H:mm:ss +d. MMMM yyyy +H:mm:ss +dd MMMM +januára,februára,marca,apríla,mája,júna,júla,augusta,septembra,októbra,novembra,decembra, +január,február,marec,apríl,máj,jún,júl,august,september,október,november,december, +gregoriánsky kalendár +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d. M. yyyy +ne,po,ut,st,št,pi,so +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/sl b/dna/Cultures/sl new file mode 100644 index 0000000..b526d55 --- /dev/null +++ b/dna/Cultures/sl @@ -0,0 +1,20 @@ +sl +0x0024 + +Slovenian +slovenski +Slovenian +sl +slv +SLV +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +sl +True +1250 +20880 +False +; +10029 +852 diff --git a/dna/Cultures/sl-SI b/dna/Cultures/sl-SI new file mode 100644 index 0000000..7f3e076 --- /dev/null +++ b/dna/Cultures/sl-SI @@ -0,0 +1,72 @@ +sl-SI +0x0424 +sl +Slovenian (Slovenia) +slovenski (Slovenija) +Slovenian (Slovenia) +sl +slv +SLV +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +sl-SI +False +1250 +20880 +False +; +10029 +852 +2 +, +. +3 +8 +3 +SIT +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-neskončnost +- +2 +, +. +3 +1 +2 +, +. +3 +1 +1 +% +‰ +neskončnost ++ +ned,pon,tor,sre,čet,pet,sob +jan,feb,mar,apr,maj,jun,jul,avg,sep,okt,nov,dec, +jan,feb,mar,apr,maj,jun,jul,avg,sep,okt,nov,dec, + +0 +. +nedelja,ponedeljek,torek,sreda,četrtek,petek,sobota +1 +d. MMMM yyyy H:mm:ss +d. MMMM yyyy +H:mm:ss +d. MMMM +januar,februar,marec,april,maj,junij,julij,avgust,september,oktober,november,december, +januar,februar,marec,april,maj,junij,julij,avgust,september,oktober,november,december, +gregorijanski koledar +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.M.yyyy +ne,po,to,sr,če,pe,so +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/sma-NO b/dna/Cultures/sma-NO new file mode 100644 index 0000000..40c5308 --- /dev/null +++ b/dna/Cultures/sma-NO @@ -0,0 +1,72 @@ +sma-NO +0x183b + +Sami (Southern) (Norway) +åarjelsaemiengiele (Nöörje) +Sami, Southern (Norway) +sma +sma +SMA +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +sma-NO +False +1252 +20277 +False +; +10000 +850 +2 +, +  +3 +12 +2 +kr +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +Infinity ++ +aej,måa,dæj,gask,duar,bearj,laav +tsïen,goevt,njok,voer,sueh,ruff,snja,mïet,skïer,golk,rahk,goev, +tsïen,goevt,njok,voer,sueh,ruff,snja,mïet,skïer,golk,rahk,goev, + +2 +. +aejlege,måanta,dæjsta,gaskevåhkoe,duarsta,bearjadahke,laavvardahke +1 +MMMM d'. b. 'yyyy HH:mm:ss +MMMM d'. b. 'yyyy +HH:mm:ss +MMMM dd +tsïengelen,goevten,njoktjen,voerhtjen,suehpeden,ruffien,snjaltjen,mïetsken,skïereden,golken,rahkan,goeven, +tsïengele,goevte,njoktje,voerhtje,suehpede,ruffie,snjaltje,mïetske,skïerede,golke,rahka,goeve, +gregoriansk kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +aej,måa,dæj,gask,duar,bearj,laav +HH:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/sma-SE b/dna/Cultures/sma-SE new file mode 100644 index 0000000..cc03836 --- /dev/null +++ b/dna/Cultures/sma-SE @@ -0,0 +1,72 @@ +sma-SE +0x1c3b + +Sami (Southern) (Sweden) +åarjelsaemiengiele (Sveerje) +Sami, Southern (Sweden) +sma +sma +SMB +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +sma-SE +False +1252 +20278 +False +; +10000 +850 +2 +, +. +3 +8 +3 +kr +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +Infinity ++ +aej,måa,dæj,gask,duar,bearj,laav +tsïen,goevt,njok,voer,sueh,ruff,snja,mïet,skïer,golk,rahk,goev, +tsïen,goevt,njok,voer,sueh,ruff,snja,mïet,skïer,golk,rahk,goev, + +2 +- +aejlege,måanta,dæjsta,gaskevåhkoe,duarsta,bearjadahke,laavvardahke +1 +MMMM d'. b. 'yyyy HH:mm:ss +MMMM d'. b. 'yyyy +HH:mm:ss +MMMM dd +tsïengelen,goevten,njoktjen,voerhtjen,suehpeden,ruffien,snjaltjen,mïetsken,skïereden,golken,rahkan,goeven, +tsïengele,goevte,njoktje,voerhtje,suehpede,ruffie,snjaltje,mïetske,skïerede,golke,rahka,goeve, +gregoriansk kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy-MM-dd +aej,måa,dæj,gask,duar,bearj,laav +HH:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/smj-NO b/dna/Cultures/smj-NO new file mode 100644 index 0000000..9cca198 --- /dev/null +++ b/dna/Cultures/smj-NO @@ -0,0 +1,72 @@ +smj-NO +0x103b + +Sami (Lule) (Norway) +julevusámegiella (Vuodna) +Sami, Lule (Norway) +smj +smj +SMJ +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +smj-NO +False +1252 +20277 +False +; +10000 +850 +2 +, +  +3 +12 +2 +kr +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +Infinity ++ +såd,mán,dis,gas,duor,bier,láv +ådåj,guov,snju,vuor,moar,bieh,snji,bårg,ragá,gålg,basá,javl, +ådåj,guov,snju,vuor,moar,bieh,snji,bårg,ragá,gålg,basá,javl, + +2 +. +sådnåbiejvve,mánnodahka,dijstahka,gasskavahkko,duorastahka,bierjjedahka,lávvodahka +1 +MMMM d'. b. 'yyyy HH:mm:ss +MMMM d'. b. 'yyyy +HH:mm:ss +MMMM dd +ådåjakmáno,guovvamáno,sjnjuktjamáno,vuoratjismáno,moarmesmáno,biehtsemáno,sjnjilltjamáno,bårggemáno,ragátmáno,gålgådismáno,basádismáno,javllamáno, +ådåjakmánno,guovvamánno,sjnjuktjamánno,vuoratjismánno,moarmesmánno,biehtsemánno,sjnjilltjamánno,bårggemánno,ragátmánno,gålgådismánno,basádismánno,javllamánno, +gregoriansk kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +såd,mán,dis,gas,duor,bier,láv +HH:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/smj-SE b/dna/Cultures/smj-SE new file mode 100644 index 0000000..73d3f19 --- /dev/null +++ b/dna/Cultures/smj-SE @@ -0,0 +1,72 @@ +smj-SE +0x143b + +Sami (Lule) (Sweden) +julevusámegiella (Svierik) +Sami, Lule (Sweden) +smj +smj +SMK +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +smj-SE +False +1252 +20278 +False +; +10000 +850 +2 +, +. +3 +8 +3 +kr +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +Infinity ++ +ájl,mán,dis,gas,duor,bier,láv +ådåj,guov,snju,vuor,moar,bieh,snji,bårg,ragá,gålg,basá,javl, +ådåj,guov,snju,vuor,moar,bieh,snji,bårg,ragá,gålg,basá,javl, + +2 +- +ájllek,mánnodahka,dijstahka,gasskavahkko,duorastahka,bierjjedahka,lávvodahka +1 +MMMM d'. b. 'yyyy HH:mm:ss +MMMM d'. b. 'yyyy +HH:mm:ss +MMMM dd +ådåjakmáno,guovvamáno,sjnjuktjamáno,vuoratjismáno,moarmesmáno,biehtsemáno,sjnjilltjamáno,bårggemáno,ragátmáno,gålgådismáno,basádismáno,javllamáno, +ådåjakmánno,guovvamánno,sjnjuktjamánno,vuoratjismánno,moarmesmánno,biehtsemánno,sjnjilltjamánno,bårggemánno,ragátmánno,gålgådismánno,basádismánno,javllamánno, +gregoriansk kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy-MM-dd +ájl,mán,dis,gas,duor,bier,láv +HH:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/smn-FI b/dna/Cultures/smn-FI new file mode 100644 index 0000000..db03685 --- /dev/null +++ b/dna/Cultures/smn-FI @@ -0,0 +1,72 @@ +smn-FI +0x243b + +Sami (Inari) (Finland) +sämikielâ (Suomâ) +Sami, Inari (Finland) +smn +smn +SMN +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +smn-FI +False +1252 +20278 +False +; +10000 +850 +2 +, +  +3 +8 +3 +€ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +Infinity ++ +pa,vu,ma,ko,tu,vá,lá +uđiv,kuov,njuh,cuoŋ,vyes,kesi,syei,porg,čoh,roov,ska,juov, +uđiv,kuov,njuh,cuoŋ,vyes,kesi,syei,porg,čoh,roov,ska,juov, + +2 +. +pasepeivi,vuossargâ,majebargâ,koskokko,tuorâstâh,vástuppeivi,lávárdâh +1 +MMMM d'. p. 'yyyy H:mm:ss +MMMM d'. p. 'yyyy +H:mm:ss +MMMM dd +uđđâivemáánu,kuovâmáánu,njuhčâmáánu,cuáŋuimáánu,vyesimáánu,kesimáánu,syeinimáánu,porgemáánu,čohčâmáánu,roovvâdmáánu,skammâmáánu,juovlâmáánu, +uđđâivemáánu,kuovâmáánu,njuhčâmáánu,cuáŋuimáánu,vyesimáánu,kesimáánu,syeinimáánu,porgemáánu,čohčâmáánu,roovvâdmáánu,skammâmáánu,juovlâmáánu, +gregoriaaninen kalenteri +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.M.yyyy +pa,vu,ma,ko,tu,vá,lá +H:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/sms-FI b/dna/Cultures/sms-FI new file mode 100644 index 0000000..6bbdee9 --- /dev/null +++ b/dna/Cultures/sms-FI @@ -0,0 +1,72 @@ +sms-FI +0x203b + +Sami (Skolt) (Finland) +sääm´ǩiõll (Lää´ddjânnam) +Sami, Skolt (Finland) +sms +sms +SMS +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +sms-FI +False +1252 +20278 +False +; +10000 +850 +2 +, +  +3 +8 +3 +€ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +Infinity ++ +pâ,vu,mâ,se,ne,pi,su +ođjm,tä´lvv,pâzl,njuh,vue,ǩie,suei,på´r,čõh,kålg,ska,rost, +ođjm,tä´lvv,pâzl,njuh,vue,ǩie,suei,på´r,čõh,kålg,ska,rost, + +2 +. +pâ´sspei´vv,vuõssargg,mââibargg,seärad,nelljdpei´vv,piâtnâc,sue´vet +1 +MMMM d'. p. 'yyyy H:mm:ss +MMMM d'. p. 'yyyy +H:mm:ss +MMMM dd +ođđee´jjmannu,tä´lvvmannu,pâ´zzlâšttammannu,njuhččmannu,vue´ssmannu,ǩie´ssmannu,suei´nnmannu,på´rǧǧmannu,čõhččmannu,kålggmannu,skamm´mannu,rosttovmannu, +ođđee´jjmään,tä´lvvmään,pâ´zzlâšttammään,njuhččmään,vue´ssmään,ǩie´ssmään,suei´nnmään,på´rǧǧmään,čõhččmään,kålggmään,skamm´mään,rosttovmään, +gregoriaaninen kalenteri +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.M.yyyy +pâ,vu,mâ,se,ne,pi,su +H:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/sq b/dna/Cultures/sq new file mode 100644 index 0000000..29e5699 --- /dev/null +++ b/dna/Cultures/sq @@ -0,0 +1,20 @@ +sq +0x001c + +Albanian +shqipe +Albanian +sq +sqi +SQI +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +sq +True +1250 +20880 +False +; +10029 +852 diff --git a/dna/Cultures/sq-AL b/dna/Cultures/sq-AL new file mode 100644 index 0000000..5f7c300 --- /dev/null +++ b/dna/Cultures/sq-AL @@ -0,0 +1,72 @@ +sq-AL +0x041c +sq +Albanian (Albania) +shqipe (Shqipëria) +Albanian (Albania) +sq +sqi +SQI +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +sq-AL +False +1250 +20880 +False +; +10029 +852 +2 +, +. +3 +5 +1 +Lek +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinity ++ +Die,Hën,Mar,Mër,Enj,Pre,Sht +Jan,Shk,Mar,Pri,Maj,Qer,Kor,Gsh,Sht,Tet,Nën,Dhj, +Jan,Shk,Mar,Pri,Maj,Qer,Kor,Gsh,Sht,Tet,Nën,Dhj, +PD +0 +- +e diel,e hënë,e martë,e mërkurë,e enjte,e premte,e shtunë +1 +yyyy-MM-dd h:mm:ss.tt +yyyy-MM-dd +h:mm:ss.tt +MMMM dd +janar,shkurt,mars,prill,maj,qershor,korrik,gusht,shtator,tetor,nëntor,dhjetor, +janar,shkurt,mars,prill,maj,qershor,korrik,gusht,shtator,tetor,nëntor,dhjetor, +Gregorian Calendar +h:mm:ss.tt +MD +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy-MM-dd +Di,Hë,Ma,Më,En,Pr,Sh +h:mm.tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +yyyy-MM diff --git a/dna/Cultures/sr b/dna/Cultures/sr new file mode 100644 index 0000000..6e0a577 --- /dev/null +++ b/dna/Cultures/sr @@ -0,0 +1,20 @@ +sr +0x7c1a + +Serbian +srpski +Serbian +sr +srp +SRB +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +sr +True +1251 +21025 +False +; +10007 +855 diff --git a/dna/Cultures/sr-Cyrl-BA b/dna/Cultures/sr-Cyrl-BA new file mode 100644 index 0000000..0a06cbf --- /dev/null +++ b/dna/Cultures/sr-Cyrl-BA @@ -0,0 +1,72 @@ +sr-Cyrl-BA +0x1c1a + +Serbian (Cyrillic) (Bosnia and Herzegovina) +српски (Босна и Херцеговина) +Serbian (Cyrillic, Bosnia and Herzegovina) +sr +sr +SRN +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +sr-Cyrl-BA +False +1251 +21025 +False +; +10007 +855 +2 +, +. +3 +8 +3 +КМ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinity ++ +нед,пон,уто,сре,чет,пет,суб +јан,феб,мар,апр,мај,јун,јул,авг,сеп,окт,нов,дец, +јан,феб,мар,апр,мај,јун,јул,авг,сеп,окт,нов,дец, + +0 +. +недеља,понедељак,уторак,среда,четвртак,петак,субота +1 +d. MMMM yyyy H:mm:ss +d. MMMM yyyy +H:mm:ss +MMMM dd +јануар,фебруар,март,април,мај,јун,јул,август,септембар,октобар,новембар,децембар, +јануар,фебруар,март,април,мај,јун,јул,август,септембар,октобар,новембар,децембар, +грегоријански календар +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.M.yyyy +нед,пон,уто,сре,чет,пет,суб +H:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/sr-Cyrl-CS b/dna/Cultures/sr-Cyrl-CS new file mode 100644 index 0000000..b17907f --- /dev/null +++ b/dna/Cultures/sr-Cyrl-CS @@ -0,0 +1,72 @@ +sr-Cyrl-CS +0x0c1a +sr +Serbian (Cyrillic, Serbia) +српски (Србија) +Serbian (Cyrillic, Serbia) +sr +srp +SRB +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +sr-Cyrl-CS +False +1251 +21025 +False +; +10007 +855 +2 +, +. +3 +8 +3 +Дин. +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-бесконачност +- +2 +, +. +3 +1 +2 +, +. +3 +1 +1 +% +‰ ++бесконачност ++ +нед,пон,уто,сре,чет,пет,суб +јан,феб,мар,апр,мај,јун,јул,авг,сеп,окт,нов,дец, +јан,феб,мар,апр,мај,јун,јул,авг,сеп,окт,нов,дец, + +0 +. +недеља,понедељак,уторак,среда,четвртак,петак,субота +1 +d. MMMM yyyy H:mm:ss +d. MMMM yyyy +H:mm:ss +d. MMMM +јануар,фебруар,март,април,мај,јун,јул,август,септембар,октобар,новембар,децембар, +јануар,фебруар,март,април,мај,јун,јул,август,септембар,октобар,новембар,децембар, +грегоријански календар +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.M.yyyy +не,по,ут,ср,че,пе,су +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/sr-Latn-BA b/dna/Cultures/sr-Latn-BA new file mode 100644 index 0000000..c101318 --- /dev/null +++ b/dna/Cultures/sr-Latn-BA @@ -0,0 +1,72 @@ +sr-Latn-BA +0x181a + +Serbian (Latin) (Bosnia and Herzegovina) +srpski (Bosna i Hercegovina) +Serbian (Latin, Bosnia and Herzegovina) +sr +sr +SRS +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +sr-Latn-BA +False +1250 +870 +False +; +10082 +852 +2 +, +. +3 +8 +3 +KM +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinity ++ +ned,pon,uto,sre,čet,pet,sub +jan,feb,mar,apr,maj,jun,jul,avg,sep,okt,nov,dec, +jan,feb,mar,apr,maj,jun,jul,avg,sep,okt,nov,dec, + +0 +. +nedelja,ponedeljak,utorak,sreda,četvrtak,petak,subota +1 +d. MMMM yyyy H:mm:ss +d. MMMM yyyy +H:mm:ss +MMMM dd +januar,februar,mart,april,maj,jun,jul,avgust,septembar,oktobar,novembar,decembar, +januar,februar,mart,april,maj,jun,jul,avgust,septembar,oktobar,novembar,decembar, +gregorijanski kalendar +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.M.yyyy +ned,pon,uto,sre,čet,pet,sub +H:mm:ss +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/sr-Latn-CS b/dna/Cultures/sr-Latn-CS new file mode 100644 index 0000000..4f5000c --- /dev/null +++ b/dna/Cultures/sr-Latn-CS @@ -0,0 +1,72 @@ +sr-Latn-CS +0x081a +sr +Serbian (Latin, Serbia) +srpski (Srbija) +Serbian (Latin, Serbia) +sr +srp +SRL +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +sr-Latn-CS +False +1250 +500 +False +; +10029 +852 +2 +, +. +3 +8 +3 +Din. +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-beskonačnost +- +2 +, +. +3 +1 +2 +, +. +3 +1 +1 +% +‰ ++beskonačnost ++ +ned,pon,uto,sre,čet,pet,sub +jan,feb,mar,apr,maj,jun,jul,avg,sep,okt,nov,dec, +jan,feb,mar,apr,maj,jun,jul,avg,sep,okt,nov,dec, + +0 +. +nedelja,ponedeljak,utorak,sreda,četvrtak,petak,subota +1 +d. MMMM yyyy H:mm:ss +d. MMMM yyyy +H:mm:ss +d. MMMM +januar,februar,mart,april,maj,jun,jul,avgust,septembar,oktobar,novembar,decembar, +januar,februar,mart,april,maj,jun,jul,avgust,septembar,oktobar,novembar,decembar, +gregorijanski kalendar +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.M.yyyy +ne,po,ut,sr,če,pe,su +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/sv b/dna/Cultures/sv new file mode 100644 index 0000000..e5a5a55 --- /dev/null +++ b/dna/Cultures/sv @@ -0,0 +1,20 @@ +sv +0x001d + +Swedish +svenska +Swedish +sv +swe +SVE +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +sv +True +1252 +20278 +False +; +10000 +850 diff --git a/dna/Cultures/sv-FI b/dna/Cultures/sv-FI new file mode 100644 index 0000000..a317494 --- /dev/null +++ b/dna/Cultures/sv-FI @@ -0,0 +1,72 @@ +sv-FI +0x081d +sv +Swedish (Finland) +svenska (Finland) +Swedish (Finland) +sv +swe +SVF +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +sv-FI +False +1252 +20278 +False +; +10000 +850 +2 +, +  +3 +8 +3 +€ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-INF +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +INF ++ +sö,må,ti,on,to,fr,lö +jan,feb,mar,apr,maj,jun,jul,aug,sep,okt,nov,dec, +jan,feb,mar,apr,maj,jun,jul,aug,sep,okt,nov,dec, + +2 +. +söndag,måndag,tisdag,onsdag,torsdag,fredag,lördag +1 +'den 'd MMMM yyyy HH:mm:ss +'den 'd MMMM yyyy +HH:mm:ss +'den 'd MMMM +januari,februari,mars,april,maj,juni,juli,augusti,september,oktober,november,december, +januari,februari,mars,april,maj,juni,juli,augusti,september,oktober,november,december, +gregoriansk kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d.M.yyyy +sö,må,ti,on,to,fr,lö +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/sv-SE b/dna/Cultures/sv-SE new file mode 100644 index 0000000..aed27cc --- /dev/null +++ b/dna/Cultures/sv-SE @@ -0,0 +1,72 @@ +sv-SE +0x041d +sv +Swedish (Sweden) +svenska (Sverige) +Swedish (Sweden) +sv +swe +SVE +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +sv-SE +False +1252 +20278 +False +; +10000 +850 +2 +, +. +3 +8 +3 +kr +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-INF +- +2 +, +  +3 +1 +2 +, +  +3 +0 +0 +% +‰ +INF ++ +sö,må,ti,on,to,fr,lö +jan,feb,mar,apr,maj,jun,jul,aug,sep,okt,nov,dec, +jan,feb,mar,apr,maj,jun,jul,aug,sep,okt,nov,dec, + +2 +- +söndag,måndag,tisdag,onsdag,torsdag,fredag,lördag +1 +'den 'd MMMM yyyy HH:mm:ss +'den 'd MMMM yyyy +HH:mm:ss +'den 'd MMMM +januari,februari,mars,april,maj,juni,juli,augusti,september,oktober,november,december, +januari,februari,mars,april,maj,juni,juli,augusti,september,oktober,november,december, +gregoriansk kalender +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy-MM-dd +sö,må,ti,on,to,fr,lö +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/sw b/dna/Cultures/sw new file mode 100644 index 0000000..9e9563d --- /dev/null +++ b/dna/Cultures/sw @@ -0,0 +1,20 @@ +sw +0x0041 + +Kiswahili +Kiswahili +Kiswahili +sw +swa +SWK +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +sw +True +1252 +500 +False +, +10000 +437 diff --git a/dna/Cultures/sw-KE b/dna/Cultures/sw-KE new file mode 100644 index 0000000..0393296 --- /dev/null +++ b/dna/Cultures/sw-KE @@ -0,0 +1,72 @@ +sw-KE +0x0441 +sw +Kiswahili (Kenya) +Kiswahili (Kenya) +Kiswahili (Kenya) +sw +swa +SWK +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +sw-KE +False +1252 +500 +False +, +10000 +437 +2 +. +, +3 +0 +0 +S +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +0 +dddd, MMMM dd, yyyy h:mm:ss tt +dddd, MMMM dd, yyyy +h:mm:ss tt +MMMM dd +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +Gregorian Calendar +h:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +M/d/yyyy +S,M,T,W,T,F,S +h:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/syr b/dna/Cultures/syr new file mode 100644 index 0000000..2bdd48f --- /dev/null +++ b/dna/Cultures/syr @@ -0,0 +1,20 @@ +syr +0x005a + +Syriac +ܣܘܪܝܝܐ +Syriac +syr +syr +SYR +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +syr +True +0 +500 +True +, +2 +1 diff --git a/dna/Cultures/syr-SY b/dna/Cultures/syr-SY new file mode 100644 index 0000000..6e8c312 --- /dev/null +++ b/dna/Cultures/syr-SY @@ -0,0 +1,72 @@ +syr-SY +0x045a +syr +Syriac (Syria) +ܣܘܪܝܝܐ (سوريا) +Syriac (Syria) +syr +syr +SYR +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +syr-SY +False +0 +500 +True +, +2 +1 +2 +. +, +3 +3 +2 +ل.س.‏ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +܏ܐ ܏ܒܫ,܏ܒ ܏ܒܫ,܏ܓ ܏ܒܫ,܏ܕ ܏ܒܫ,܏ܗ ܏ܒܫ,܏ܥܪܘܒ,܏ܫܒ +܏ܟܢ ܏ܒ,ܫܒܛ,ܐܕܪ,ܢܝܣܢ,ܐܝܪ,ܚܙܝܪܢ,ܬܡܘܙ,ܐܒ,ܐܝܠܘܠ,܏ܬܫ ܏ܐ,܏ܬܫ ܏ܒ,܏ܟܢ ܏ܐ, +܏ܟܢ ܏ܒ,ܫܒܛ,ܐܕܪ,ܢܝܣܢ,ܐܝܪ,ܚܙܝܪܢ,ܬܡܘܙ,ܐܒ,ܐܝܠܘܠ,܏ܬܫ ܏ܐ,܏ܬܫ ܏ܒ,܏ܟܢ ܏ܐ, +ܩ.ܛ +0 +/ +ܚܕ ܒܫܒܐ,ܬܪܝܢ ܒܫܒܐ,ܬܠܬܐ ܒܫܒܐ,ܐܪܒܥܐ ܒܫܒܐ,ܚܡܫܐ ܒܫܒܐ,ܥܪܘܒܬܐ,ܫܒܬܐ +6 +dd MMMM, yyyy hh:mm:ss tt +dd MMMM, yyyy +hh:mm:ss tt +dd MMMM +ܟܢܘܢ ܐܚܪܝ,ܫܒܛ,ܐܕܪ,ܢܝܣܢ,ܐܝܪ,ܚܙܝܪܢ,ܬܡܘܙ,ܐܒ,ܐܝܠܘܠ,ܬܫܪܝ ܩܕܝܡ,ܬܫܪܝ ܐܚܪܝ,ܟܢܘܢ ܩܕܝܡ, +ܟܢܘܢ ܐܚܪܝ,ܫܒܛ,ܐܕܪ,ܢܝܣܢ,ܐܝܪ,ܚܙܝܪܢ,ܬܡܘܙ,ܐܒ,ܐܝܠܘܠ,ܬܫܪܝ ܩܕܝܡ,ܬܫܪܝ ܐܚܪܝ,ܟܢܘܢ ܩܕܝܡ, +ܣܘܪܓܕܐ ܓܪܝܓܘܪܝܐ +hh:mm:ss tt +ܒ.ܛ +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +܏,܏,܏,܏,܏,܏,܏ +hh:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/ta b/dna/Cultures/ta new file mode 100644 index 0000000..49e9458 --- /dev/null +++ b/dna/Cultures/ta @@ -0,0 +1,20 @@ +ta +0x0049 + +Tamil +தமிழ் +Tamil +ta +tam +TAM +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +ta +True +0 +500 +False +, +2 +1 diff --git a/dna/Cultures/ta-IN b/dna/Cultures/ta-IN new file mode 100644 index 0000000..7655495 --- /dev/null +++ b/dna/Cultures/ta-IN @@ -0,0 +1,72 @@ +ta-IN +0x0449 +ta +Tamil (India) +தமிழ் (இந்தியா) +Tamil (India) +ta +tam +TAM +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +ta-IN +False +0 +500 +False +, +2 +1 +2 +. +, +3,2 +12 +2 +ரூ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3,2 +1 +2 +. +, +3,2 +0 +0 +% +‰ +Infinity ++ +ஞா,தி,செ,பு,வி,வெ,ச +ஜன.,பெப்.,மார்.,ஏப்.,மே,ஜூன்,ஜூலை,ஆக.,செப்.,அக்.,நவ.,டிச., +ஜன.,பெப்.,மார்.,ஏப்.,மே,ஜூன்,ஜூலை,ஆக.,செப்.,அக்.,நவ.,டிச., +காலை +0 +- +ஞாயிறு,திங்கள்,செவ்வாய்,புதன்,வியாழன்,வெள்ளி,சனி +1 +dd MMMM yyyy HH:mm:ss +dd MMMM yyyy +HH:mm:ss +dd MMMM +ஜனவரி,பெப்ரவரி,மார்ச்,ஏப்ரல்,மே,ஜூன்,ஜூலை,ஆகஸ்ட்,செப்டம்பர்,அக்டோபர்,நவம்பர்,டிசம்பர், +ஜனவரி,பெப்ரவரி,மார்ச்,ஏப்ரல்,மே,ஜூன்,ஜூலை,ஆகஸ்ட்,செப்டம்பர்,அக்டோபர்,நவம்பர்,டிசம்பர், +ஆங்கில வருடம் +HH:mm:ss +மாலை +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yyyy +ஞ,த,ச,ப,வ,வ,ச +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/te b/dna/Cultures/te new file mode 100644 index 0000000..8bc9177 --- /dev/null +++ b/dna/Cultures/te @@ -0,0 +1,20 @@ +te +0x004a + +Telugu +తెలుగు +Telugu +te +tel +TEL +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +te +True +0 +500 +False +, +2 +1 diff --git a/dna/Cultures/te-IN b/dna/Cultures/te-IN new file mode 100644 index 0000000..f1c334d --- /dev/null +++ b/dna/Cultures/te-IN @@ -0,0 +1,72 @@ +te-IN +0x044a +te +Telugu (India) +తెలుగు (భారత దేశం) +Telugu (India) +te +tel +TEL +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +te-IN +False +0 +500 +False +, +2 +1 +2 +. +, +3,2 +12 +2 +రూ +1 +NaN +౦,౧,౨,౩,౪,౫,౬,౭,౮,౯ +-Infinity +- +2 +. +, +3,2 +1 +2 +. +, +3,2 +0 +0 +% +‰ +Infinity ++ +ఆది.,సోమ.,మంగళ.,బుధ.,గురు.,శుక్ర.,శని. +జనవరి,ఫిబ్రవరి,మార్చి,ఏప్రిల్,మే,జూన్,జూలై,ఆగస్టు,సెప్టెంబర్,అక్టోబర్,నవంబర్,డిసెంబర్, +జనవరి,ఫిబ్రవరి,మార్చి,ఏప్రిల్,మే,జూన్,జూలై,ఆగస్టు,సెప్టెంబర్,అక్టోబర్,నవంబర్,డిసెంబర్, +పూర్వాహ్న +0 +- +ఆదివారం,సోమవారం,మంగళవారం,బుధవారం,గురువారం,శుక్రవారం,శనివారం +1 +dd MMMM yyyy HH:mm:ss +dd MMMM yyyy +HH:mm:ss +dd MMMM +జనవరి,ఫిబ్రవరి,మార్చి,ఏప్రిల్,మే,జూన్,జూలై,ఆగస్టు,సెప్టెంబర్,అక్టోబర్,నవంబర్,డిసెంబర్, +జనవరి,ఫిబ్రవరి,మార్చి,ఏప్రిల్,మే,జూన్,జూలై,ఆగస్టు,సెప్టెంబర్,అక్టోబర్,నవంబర్,డిసెంబర్, +ఇంగ్లీషు క్యాలండర్ +HH:mm:ss +అపరాహ్న +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd-MM-yy +ఆ,స,మ,బ,గ,శ,శ +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/th b/dna/Cultures/th new file mode 100644 index 0000000..e33bdde --- /dev/null +++ b/dna/Cultures/th @@ -0,0 +1,20 @@ +th +0x001e + +Thai +ไทย +Thai +th +tha +THA +ThaiBuddhistCalendar +ThaiBuddhistCalendar,GregorianCalendar:Localized +65 +th +True +874 +20838 +False +, +10021 +874 diff --git a/dna/Cultures/th-TH b/dna/Cultures/th-TH new file mode 100644 index 0000000..98be3ab --- /dev/null +++ b/dna/Cultures/th-TH @@ -0,0 +1,72 @@ +th-TH +0x041e +th +Thai (Thailand) +ไทย (ไทย) +Thai (Thailand) +th +tha +THA +ThaiBuddhistCalendar +ThaiBuddhistCalendar,GregorianCalendar:Localized +70 +th-TH +False +874 +20838 +False +, +10021 +874 +2 +. +, +3 +1 +0 +฿ +1 +NaN +๐,๑,๒,๓,๔,๕,๖,๗,๘,๙ +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +อา.,จ.,อ.,พ.,พฤ.,ศ.,ส. +ม.ค.,ก.พ.,มี.ค.,เม.ย.,พ.ค.,มิ.ย.,ก.ค.,ส.ค.,ก.ย.,ต.ค.,พ.ย.,ธ.ค., +ม.ค.,ก.พ.,มี.ค.,เม.ย.,พ.ค.,มิ.ย.,ก.ค.,ส.ค.,ก.ย.,ต.ค.,พ.ย.,ธ.ค., +AM +0 +/ +อาทิตย์,จันทร์,อังคาร,พุธ,พฤหัสบดี,ศุกร์,เสาร์ +1 +d MMMM yyyy H:mm:ss +d MMMM yyyy +H:mm:ss +dd MMMM +มกราคม,กุมภาพันธ์,มีนาคม,เมษายน,พฤษภาคม,มิถุนายน,กรกฎาคม,สิงหาคม,กันยายน,ตุลาคม,พฤศจิกายน,ธันวาคม, +มกราคม,กุมภาพันธ์,มีนาคม,เมษายน,พฤษภาคม,มิถุนายน,กรกฎาคม,สิงหาคม,กันยายน,ตุลาคม,พฤศจิกายน,ธันวาคม, +พุทธศักราช +H:mm:ss +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d/M/yyyy +อ,จ,อ,พ,พ,ศ,ส +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/tn-ZA b/dna/Cultures/tn-ZA new file mode 100644 index 0000000..11eca93 --- /dev/null +++ b/dna/Cultures/tn-ZA @@ -0,0 +1,72 @@ +tn-ZA +0x0432 + +Tswana (South Africa) +Setswana (Aforika Borwa) +Tswana +tn +tn +TSN +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +tn-ZA +False +1252 +500 +False +, +10000 +850 +2 +. +, +3 +2 +2 +R +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +Latshipi,Mosupologo,Labobedi,Laboraro,Labone,Labotlhano,Lamatlhatso +0 +dd MMMM yyyy hh:mm:ss tt +dd MMMM yyyy +hh:mm:ss tt +MMMM dd +Ferikgong,Tlhakole,Mopitloe,Moranang,Motsheganong,Seetebosigo,Phukwi,Phatwe,Lwetse,Diphalane,Ngwanatsele,Sedimothole, +Ferikgong,Tlhakole,Mopitloe,Moranang,Motsheganong,Seetebosigo,Phukwi,Phatwe,Lwetse,Diphalane,Ngwanatsele,Sedimothole, +Gregorian Calendar +hh:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy/MM/dd +Sun,Mon,Tue,Wed,Thu,Fri,Sat +hh:mm:ss tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/tr b/dna/Cultures/tr new file mode 100644 index 0000000..9b4f133 --- /dev/null +++ b/dna/Cultures/tr @@ -0,0 +1,20 @@ +tr +0x001f + +Turkish +Türkçe +Turkish +tr +tur +TRK +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +tr +True +1254 +20905 +False +; +10081 +857 diff --git a/dna/Cultures/tr-TR b/dna/Cultures/tr-TR new file mode 100644 index 0000000..d53fd77 --- /dev/null +++ b/dna/Cultures/tr-TR @@ -0,0 +1,72 @@ +tr-TR +0x041f +tr +Turkish (Turkey) +Türkçe (Türkiye) +Turkish (Turkey) +tr +tur +TRK +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +tr-TR +False +1254 +20905 +False +; +10081 +857 +2 +, +. +3 +8 +3 +YTL +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +1 +2 +, +. +3 +2 +2 +% +‰ +Infinity ++ +Paz,Pzt,Sal,Çar,Per,Cum,Cmt +Oca,Şub,Mar,Nis,May,Haz,Tem,Ağu,Eyl,Eki,Kas,Ara, +Oca,Şub,Mar,Nis,May,Haz,Tem,Ağu,Eyl,Eki,Kas,Ara, + +0 +. +Pazar,Pazartesi,Salı,Çarşamba,Perşembe,Cuma,Cumartesi +1 +dd MMMM yyyy dddd HH:mm:ss +dd MMMM yyyy dddd +HH:mm:ss +dd MMMM +Ocak,Şubat,Mart,Nisan,Mayıs,Haziran,Temmuz,Ağustos,Eylül,Ekim,Kasım,Aralık, +Ocak,Şubat,Mart,Nisan,Mayıs,Haziran,Temmuz,Ağustos,Eylül,Ekim,Kasım,Aralık, +Gregoryen Takvimi +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +Pz,Pt,Sa,Ça,Pe,Cu,Ct +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/tt b/dna/Cultures/tt new file mode 100644 index 0000000..4d22b23 --- /dev/null +++ b/dna/Cultures/tt @@ -0,0 +1,20 @@ +tt +0x0044 + +Tatar +Татар +Tatar +tt +tat +TTT +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +tt +True +1251 +20880 +False +; +10007 +866 diff --git a/dna/Cultures/tt-RU b/dna/Cultures/tt-RU new file mode 100644 index 0000000..da28949 --- /dev/null +++ b/dna/Cultures/tt-RU @@ -0,0 +1,72 @@ +tt-RU +0x0444 +tt +Tatar (Russia) +Татар (Россия) +Tatar (Russia) +tt +tat +TTT +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +tt-RU +False +1251 +20880 +False +; +10007 +866 +2 +, +  +3 +8 +3 +р. +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +1 +1 +% +‰ +Infinity ++ +Якш,Дүш,Сиш,Чәрш,Пәнҗ,Җом,Шим +Гыйнв,Фев,Мар,Апр,май,Июн,Июл,Авг,Сен,Окт,Ноя,Дек, +Гыйнв,Фев,Мар,Апр,Май,Июн,Июл,Авг,Сен,Окт,Ноя,Дек, + +0 +. +Якшәмбе,Дүшәмбе,Сишәмбе,Чәршәмбе,Пәнҗешәмбе,Җомга,Шимбә +1 +d MMMM yyyy H:mm:ss +d MMMM yyyy +H:mm:ss +d MMMM +гыйнварь,февраль,март,апрель,май,июнь,июль,август,сентябрь,октябрь,ноябрь,декабрь, +Гыйнварь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь, +Григориан календаре +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +Якш,Дүш,Сиш,Чәрш,Пәнҗ,Җом,Шим +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/uk b/dna/Cultures/uk new file mode 100644 index 0000000..fdc0aa3 --- /dev/null +++ b/dna/Cultures/uk @@ -0,0 +1,20 @@ +uk +0x0022 + +Ukrainian +україньска +Ukrainian +uk +ukr +UKR +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +uk +True +1251 +500 +False +; +10017 +866 diff --git a/dna/Cultures/uk-UA b/dna/Cultures/uk-UA new file mode 100644 index 0000000..4a03300 --- /dev/null +++ b/dna/Cultures/uk-UA @@ -0,0 +1,72 @@ +uk-UA +0x0422 +uk +Ukrainian (Ukraine) +україньска (Україна) +Ukrainian (Ukraine) +uk +ukr +UKR +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +uk-UA +False +1251 +500 +False +; +10017 +866 +2 +, +  +3 +8 +3 +грн. +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-безмежність +- +2 +, +  +3 +1 +2 +, +  +3 +1 +1 +% +‰ +безмежність ++ +Нд,Пн,Вт,Ср,Чт,Пт,Сб +Січ,Лют,Бер,Кві,Тра,Чер,Лип,Сер,Вер,Жов,Лис,Гру, +Січ,Лют,Бер,Кві,Тра,Чер,Лип,Сер,Вер,Жов,Лис,Гру, + +0 +. +неділя,понеділок,вівторок,середа,четвер,п'ятниця,субота +1 +d MMMM yyyy' р.' H:mm:ss +d MMMM yyyy' р.' +H:mm:ss +d MMMM +січня,лютого,березня,квітня,травня,червня,липня,серпня,вересня,жовтня,листопада,грудня, +Січень,Лютий,Березень,Квітень,Травень,Червень,Липень,Серпень,Вересень,Жовтень,Листопад,Грудень, +Григоріаньский календар +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +Нд,Пн,Вт,Ср,Чт,Пт,Сб +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy' р.' diff --git a/dna/Cultures/ur b/dna/Cultures/ur new file mode 100644 index 0000000..0f98ec5 --- /dev/null +++ b/dna/Cultures/ur @@ -0,0 +1,20 @@ +ur +0x0020 + +Urdu +اُردو +Urdu +ur +urd +URD +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +ur +True +1256 +20420 +True +; +10004 +720 diff --git a/dna/Cultures/ur-PK b/dna/Cultures/ur-PK new file mode 100644 index 0000000..823f59c --- /dev/null +++ b/dna/Cultures/ur-PK @@ -0,0 +1,72 @@ +ur-PK +0x0420 +ur +Urdu (Islamic Republic of Pakistan) +اُردو (پاکستان) +Urdu (Islamic Republic of Pakistan) +ur +urd +URD +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish,HijriCalendar +70 +ur-PK +False +1256 +20420 +True +; +10004 +720 +2 +. +, +3 +3 +0 +Rs +1 +NaN +۰,۱,۲,۳,۴,۵,۶,۷,۸,۹ +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +اتوار,پير,منگل,بدھ,جمعرات,جمعه,هفته +جنورى,فرورى,مارچ,اپريل,مئ,جون,جولاٸ,اگست,ستمبر,اکتوبر,نومبر,دسمبر, +جنورى,فرورى,مارچ,اپريل,مئ,جون,جولاٸ,اگست,ستمبر,اکتوبر,نومبر,دسمبر, +AM +1 +/ +اتوار,پير,منگل,بدھ,جمعرات,جمعه,هفته +1 +dd MMMM, yyyy h:mm:ss tt +dd MMMM, yyyy +h:mm:ss tt +dd MMMM +جنورى,فرورى,مارچ,اپريل,مئ,جون,جولاٸ,اگست,ستمبر,اکتوبر,نومبر,دسمبر, +جنورى,فرورى,مارچ,اپريل,مئ,جون,جولاٸ,اگست,ستمبر,اکتوبر,نومبر,دسمبر, +عيسوى سال +h:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +ا,پ,م,ب,ج,ج,ه +h:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/uz b/dna/Cultures/uz new file mode 100644 index 0000000..6f26145 --- /dev/null +++ b/dna/Cultures/uz @@ -0,0 +1,20 @@ +uz +0x0043 + +Uzbek +U'zbek +Uzbek +uz +uzb +UZB +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +uz +True +1254 +500 +False +; +10029 +857 diff --git a/dna/Cultures/uz-Cyrl-UZ b/dna/Cultures/uz-Cyrl-UZ new file mode 100644 index 0000000..3ee4941 --- /dev/null +++ b/dna/Cultures/uz-Cyrl-UZ @@ -0,0 +1,72 @@ +uz-Cyrl-UZ +0x0843 +uz +Uzbek (Cyrillic, Uzbekistan) +Ўзбек (Ўзбекистон) +Uzbek (Cyrillic, Uzbekistan) +uz +uzb +UZB +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +uz-Cyrl-UZ +False +1251 +20880 +False +; +10007 +866 +2 +, +  +3 +8 +3 +сўм +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +1 +1 +% +‰ +Infinity ++ +якш,дш,сш,чш,пш,ж,ш +Янв,Фев,Мар,Апр,мая,Июн,Июл,Авг,Сен,Окт,Ноя,Дек, +Янв,Фев,Мар,Апр,Май,Июн,Июл,Авг,Сен,Окт,Ноя,Дек, + +0 +. +якшанба,душанба,сешанба,чоршанба,пайшанба,жума,шанба +1 +yyyy 'йил' d-MMMM HH:mm:ss +yyyy 'йил' d-MMMM +HH:mm:ss +d-MMMM +январ,феврал,март,апрел,май,июн,июл,август,сентябр,октябр,ноябр,декабр, +Январ,Феврал,Март,Апрел,Май,Июн,Июл,Август,Сентябр,Октябр,Ноябр,Декабр, +григорианский календарь +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd.MM.yyyy +якш,дш,сш,чш,пш,ж,ш +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/uz-Latn-UZ b/dna/Cultures/uz-Latn-UZ new file mode 100644 index 0000000..9560596 --- /dev/null +++ b/dna/Cultures/uz-Latn-UZ @@ -0,0 +1,72 @@ +uz-Latn-UZ +0x0443 +uz +Uzbek (Latin, Uzbekistan) +U'zbek (U'zbekiston Respublikasi) +Uzbek (Latin, Uzbekistan) +uz +uzb +UZB +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +uz-Latn-UZ +False +1254 +500 +False +; +10029 +857 +0 +, +  +3 +8 +3 +su'm +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +  +3 +1 +2 +, +  +3 +1 +1 +% +‰ +Infinity ++ +yak.,dsh.,sesh.,chr.,psh.,jm.,sh. +yanvar,fevral,mart,aprel,may,iyun,iyul,avgust,sentyabr,oktyabr,noyabr,dekabr, +yanvar,fevral,mart,aprel,may,iyun,iyul,avgust,sentyabr,oktyabr,noyabr,dekabr, + +0 +/ +yakshanba,dushanba,seshanba,chorshanba,payshanba,juma,shanba +1 +yyyy 'yil' d-MMMM HH:mm:ss +yyyy 'yil' d-MMMM +HH:mm:ss +d-MMMM +yanvar,fevral,mart,aprel,may,iyun,iyul,avgust,sentyabr,oktyabr,noyabr,dekabr, +yanvar,fevral,mart,aprel,may,iyun,iyul,avgust,sentyabr,oktyabr,noyabr,dekabr, +Grigorianski +HH:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM yyyy +yak,dsh,sesh,chr,psh,jm,sh +HH:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/vi b/dna/Cultures/vi new file mode 100644 index 0000000..baa2cda --- /dev/null +++ b/dna/Cultures/vi @@ -0,0 +1,20 @@ +vi +0x002a + +Vietnamese +Tiếng Việt +Vietnamese +vi +vie +VIT +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +vi +True +1258 +500 +False +, +10000 +1258 diff --git a/dna/Cultures/vi-VN b/dna/Cultures/vi-VN new file mode 100644 index 0000000..925d572 --- /dev/null +++ b/dna/Cultures/vi-VN @@ -0,0 +1,72 @@ +vi-VN +0x042a +vi +Vietnamese (Vietnam) +Tiếng Việt (Việt Nam) +Vietnamese (Vietnam) +vi +vie +VIT +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +vi-VN +False +1258 +500 +False +, +10000 +1258 +2 +, +. +3 +8 +3 +₫ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +, +. +3 +1 +2 +, +. +3 +0 +0 +% +‰ +Infinity ++ +CN,Hai,Ba,Tư,Năm,Sáu,Bảy +Thg1,Thg2,Thg3,Thg4,Thg5,Thg6,Thg7,Thg8,Thg9,Thg10,Thg11,Thg12, +Thg1,Thg2,Thg3,Thg4,Thg5,Thg6,Thg7,Thg8,Thg9,Thg10,Thg11,Thg12, +SA +0 +/ +Chủ Nhật,Thứ Hai,Thứ Ba,Thứ Tư,Thứ Năm,Thứ Sáu,Thứ Bảy +1 +dd MMMM yyyy h:mm:ss tt +dd MMMM yyyy +h:mm:ss tt +dd MMMM +Tháng Giêng,Tháng Hai,Tháng Ba,Tháng Tư,Tháng Năm,Tháng Sáu,Tháng Bảy,Tháng Tám,Tháng Chín,Tháng Mười,Tháng Mười Một,Tháng Mười Hai, +Tháng Giêng,Tháng Hai,Tháng Ba,Tháng Tư,Tháng Năm,Tháng Sáu,Tháng Bảy,Tháng Tám,Tháng Chín,Tháng Mười,Tháng Mười Một,Tháng Mười Hai, +Dương Lịch +h:mm:ss tt +CH +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +dd/MM/yyyy +C,H,B,T,N,S,B +h:mm tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/xh-ZA b/dna/Cultures/xh-ZA new file mode 100644 index 0000000..3a19ad2 --- /dev/null +++ b/dna/Cultures/xh-ZA @@ -0,0 +1,72 @@ +xh-ZA +0x0434 + +Xhosa (South Africa) +isiXhosa (uMzantsi Afrika) +Xhosa +xh +xh +XHO +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +xh-ZA +False +1252 +500 +False +, +10000 +850 +2 +. +, +3 +2 +2 +R +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +iCawa,uMvulo,uLwesibini,uLwesithathu,uLwesine,uLwesihlanu,uMgqibelo +0 +dd MMMM yyyy hh:mm:ss tt +dd MMMM yyyy +hh:mm:ss tt +MMMM dd +eyoMqungu,eyoMdumba,eyoKwindla,Tshazimpuzi,Canzibe,eyeSilimela,eyeKhala,eyeThupha,eyoMsintsi,eyeDwara,eyeNkanga,eyoMnga, +eyoMqungu,eyoMdumba,eyoKwindla,Tshazimpuzi,Canzibe,eyeSilimela,eyeKhala,eyeThupha,eyoMsintsi,eyeDwara,eyeNkanga,eyoMnga, +Gregorian Calendar +hh:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy/MM/dd +Sun,Mon,Tue,Wed,Thu,Fri,Sat +hh:mm:ss tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Cultures/zh-CHS b/dna/Cultures/zh-CHS new file mode 100644 index 0000000..e5a3e5e --- /dev/null +++ b/dna/Cultures/zh-CHS @@ -0,0 +1,20 @@ +zh-CHS +0x0004 +zh-Hans +Chinese (Simplified) +中文(简体) +Chinese (Simplified) +zh +zho +CHS +GregorianCalendar:Localized +GregorianCalendar:Localized +65 +zh-Hans +True +936 +500 +False +, +10008 +936 diff --git a/dna/Cultures/zh-CHT b/dna/Cultures/zh-CHT new file mode 100644 index 0000000..7b76946 --- /dev/null +++ b/dna/Cultures/zh-CHT @@ -0,0 +1,20 @@ +zh-CHT +0x7c04 +zh-Hant +Chinese (Traditional) +中文(繁體) +Chinese (Traditional) +zh +zho +CHT +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish +65 +zh-Hant +True +950 +500 +False +, +10002 +950 diff --git a/dna/Cultures/zh-CN b/dna/Cultures/zh-CN new file mode 100644 index 0000000..4475f34 --- /dev/null +++ b/dna/Cultures/zh-CN @@ -0,0 +1,72 @@ +zh-CN +0x0804 +zh-CHS +Chinese (People's Republic of China) +中文(中华人民共和国) +Chinese (People's Republic of China) +zh +zho +CHS +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +zh-CN +False +936 +500 +False +, +10008 +936 +2 +. +, +3 +2 +0 +¥ +1 +非数字 +0,1,2,3,4,5,6,7,8,9 +负无穷大 +- +2 +. +, +3 +1 +2 +. +, +3 +1 +1 +% +‰ +正无穷大 ++ +日,一,二,三,四,五,六 +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, +上午 +0 +/ +星期日,星期一,星期二,星期三,星期四,星期五,星期六 +0 +yyyy'年'M'月'd'日' H:mm:ss +yyyy'年'M'月'd'日' +H:mm:ss +M'月'd'日' +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, +公历 +H:mm:ss +下午 +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy/M/d +日,一,二,三,四,五,六 +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +yyyy'年'M'月' diff --git a/dna/Cultures/zh-HK b/dna/Cultures/zh-HK new file mode 100644 index 0000000..a0e1a7b --- /dev/null +++ b/dna/Cultures/zh-HK @@ -0,0 +1,72 @@ +zh-HK +0x0c04 +zh-CHT +Chinese (Hong Kong S.A.R.) +中文(香港特别行政區) +Chinese (Hong Kong S.A.R.) +zh +zho +ZHH +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +zh-HK +False +950 +500 +False +, +10002 +950 +2 +. +, +3 +0 +0 +HK$ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +1 +1 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, + +0 +/ +Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday +0 +dddd, d MMMM, yyyy H:mm:ss +dddd, d MMMM, yyyy +H:mm:ss +d MMMM +January,February,March,April,May,June,July,August,September,October,November,December, +January,February,March,April,May,June,July,August,September,October,November,December, +日曆 +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d/M/yyyy +Su,Mo,Tu,We,Th,Fr,Sa +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/zh-MO b/dna/Cultures/zh-MO new file mode 100644 index 0000000..1923256 --- /dev/null +++ b/dna/Cultures/zh-MO @@ -0,0 +1,72 @@ +zh-MO +0x1404 +zh-CHT +Chinese (Macao S.A.R.) +中文(澳門特别行政區) +Chinese (Macao S.A.R.) +zh +zho +ZHM +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +zh-MO +False +950 +500 +False +, +10002 +950 +2 +. +, +3 +0 +0 +MOP +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +1 +1 +% +‰ +Infinity ++ +星期日,星期一,星期二,星期三,星期四,星期五,星期六 +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, + +0 +/ +星期日,星期一,星期二,星期三,星期四,星期五,星期六 +0 +dddd, d MMMM, yyyy H:mm:ss +dddd, d MMMM, yyyy +H:mm:ss +d MMMM +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, +西曆 +H:mm:ss + +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d/M/yyyy +日,一,二,三,四,五,六 +H:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/zh-SG b/dna/Cultures/zh-SG new file mode 100644 index 0000000..8d07b65 --- /dev/null +++ b/dna/Cultures/zh-SG @@ -0,0 +1,72 @@ +zh-SG +0x1004 +zh-CHS +Chinese (Singapore) +中文(新加坡) +Chinese (Singapore) +zh +zho +ZHI +GregorianCalendar:Localized +GregorianCalendar:Localized +70 +zh-SG +False +936 +500 +False +, +10008 +936 +2 +. +, +3 +0 +0 +$ +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +1 +1 +% +‰ +Infinity ++ +星期日,星期一,星期二,星期三,星期四,星期五,星期六 +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, +AM +0 +/ +星期日,星期一,星期二,星期三,星期四,星期五,星期六 +0 +dddd, d MMMM, yyyy tt h:mm:ss +dddd, d MMMM, yyyy +tt h:mm:ss +d MMMM +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, +西历 +tt h:mm:ss +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +d/M/yyyy +日,一,二,三,四,五,六 +tt h:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM, yyyy diff --git a/dna/Cultures/zh-TW b/dna/Cultures/zh-TW new file mode 100644 index 0000000..c7029ea --- /dev/null +++ b/dna/Cultures/zh-TW @@ -0,0 +1,72 @@ +zh-TW +0x0404 +zh-CHT +Chinese (Taiwan) +中文(台灣) +Chinese (Taiwan) +zh +zho +CHT +GregorianCalendar:Localized +GregorianCalendar:Localized,GregorianCalendar:USEnglish,TaiwanCalendar +70 +zh-TW +False +950 +500 +False +, +10002 +950 +2 +. +, +3 +1 +0 +NT$ +1 +不是一個數字 +0,1,2,3,4,5,6,7,8,9 +負無窮大 +- +2 +. +, +3 +1 +2 +. +, +3 +1 +1 +% +‰ +正無窮大 ++ +星期日,星期一,星期二,星期三,星期四,星期五,星期六 +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, +上午 +0 +/ +星期日,星期一,星期二,星期三,星期四,星期五,星期六 +0 +yyyy'年'M'月'd'日' tt hh:mm:ss +yyyy'年'M'月'd'日' +tt hh:mm:ss +M'月'd'日' +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, +一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月, +西曆 (中文) +tt hh:mm:ss +下午 +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy/M/d +日,一,二,三,四,五,六 +tt hh:mm +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +yyyy'年'M'月' diff --git a/dna/Cultures/zu-ZA b/dna/Cultures/zu-ZA new file mode 100644 index 0000000..96e4006 --- /dev/null +++ b/dna/Cultures/zu-ZA @@ -0,0 +1,72 @@ +zu-ZA +0x0435 + +Zulu (South Africa) +isiZulu (iNingizimu Afrika) +Zulu +zu +zu +ZUL +GregorianCalendar:Localized +GregorianCalendar:Localized +38 +zu-ZA +False +1252 +500 +False +, +10000 +850 +2 +. +, +3 +2 +2 +R +1 +NaN +0,1,2,3,4,5,6,7,8,9 +-Infinity +- +2 +. +, +3 +1 +2 +. +, +3 +0 +0 +% +‰ +Infinity ++ +Sun,Mon,Tue,Wed,Thu,Fri,Sat +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec, +AM +0 +/ +iSonto,uMsombuluko,uLwesibili,uLwesithathu,uLwesine,uLwesihlanu,uMgqibelo +0 +dd MMMM yyyy hh:mm:ss tt +dd MMMM yyyy +hh:mm:ss tt +MMMM dd +uJanuwari,uFebuwari,uMashi,uAprhili,uMeyi,uJuni,uJulayi,uAgaste,uSepthemba,uOkthoba,uNovemba,uDisemba, +uJanuwari,uFebuwari,uMashi,uAprhili,uMeyi,uJuni,uJulayi,uAgaste,uSepthemba,uOkthoba,uNovemba,uDisemba, +Gregorian Calendar +hh:mm:ss tt +PM +ddd, dd MMM yyyy HH':'mm':'ss 'GMT' +yyyy/MM/dd +Sun,Mon,Tue,Wed,Thu,Fri,Sat +hh:mm:ss tt +yyyy'-'MM'-'dd'T'HH':'mm':'ss +: +yyyy'-'MM'-'dd HH':'mm':'ss'Z' +MMMM yyyy diff --git a/dna/Delegate.c b/dna/Delegate.c new file mode 100644 index 0000000..bc22962 --- /dev/null +++ b/dna/Delegate.c @@ -0,0 +1,79 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "Delegate.h" +#include "MetaData.h" +#include "Heap.h" + +// Note that care is needed to ensure the target object refered to in the delegate is not accidently +// garbage collected. +// Because a non-precise GC is currently used, this just happens automatically. +// The HEAP_PTR targetObj keeps the target object alive. + +typedef struct tDelegate_ tDelegate; +struct tDelegate_ { + // These must match the definition in Delegate.cs + // The target object, null if calling a static method + HEAP_PTR targetObj; + // The target method + tMD_MethodDef *pTargetMethod; + // The next delegate in a multicast delegate + tDelegate *pNext; +}; + +tMD_MethodDef* Delegate_GetMethod(void *pThis_) { + tDelegate *pThis = (tDelegate*)pThis_; + + return pThis->pTargetMethod; +} + +tMD_MethodDef* Delegate_GetMethodAndStore(void *pThis_, HEAP_PTR *pTargetObj, void **ppNextDelegate) { + tDelegate *pThis = (tDelegate*)pThis_; + + *pTargetObj = pThis->targetObj; + if (ppNextDelegate != NULL) { + *ppNextDelegate = pThis->pNext; + } + return pThis->pTargetMethod; +} + +static tAsyncCall* ctor(PTR pThis_, PTR pParams, PTR pReturnValue) { + // Note that the 'this' object is already allocated because this method is not + // marked as 'InternalMethod' - it is marked as 'runtime' + tDelegate *pThis = (tDelegate*)pThis_; + + pThis->targetObj = ((HEAP_PTR*)pParams)[0]; + pThis->pTargetMethod = ((tMD_MethodDef**)pParams)[1]; + pThis->pNext = NULL; + + return NULL; +} + +fnInternalCall Map_Delegate(tMD_MethodDef *pMethod) { + // Note that it is not neccessary to check argument types here, as delegates are very tightly controlled + if (strcmp(pMethod->name, ".ctor") == 0) { + return ctor; + } + + return NULL; +} \ No newline at end of file diff --git a/dna/Delegate.h b/dna/Delegate.h new file mode 100644 index 0000000..dea6cf9 --- /dev/null +++ b/dna/Delegate.h @@ -0,0 +1,33 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined (__DELEGATE_H) +#define __DELEGATE_H + +#include "MetaData.h" +#include "Types.h" + +fnInternalCall Map_Delegate(tMD_MethodDef *pMethod); + +tMD_MethodDef* Delegate_GetMethod(void *pThis_); +tMD_MethodDef* Delegate_GetMethodAndStore(void *pThis_, HEAP_PTR *pTargetObj, void **ppNextDelegate); + + +#endif \ No newline at end of file diff --git a/dna/EvalStack.h b/dna/EvalStack.h new file mode 100644 index 0000000..5c978fe --- /dev/null +++ b/dna/EvalStack.h @@ -0,0 +1,39 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined (__EVALSTACK_H) +#define __EVALSTACK_H + +#define EVALSTACK_INT64 0 +#define EVALSTACK_INT32 1 +#define EVALSTACK_INTNATIVE 2 +//#define EVALSTACK_F 3 +#define EVALSTACK_F64 3 +#define EVALSTACK_PTR 4 +#define EVALSTACK_O 5 +//#define EVALSTACK_TRANSPTR 6 +#define EVALSTACK_F32 6 +#define EVALSTACK_VALUETYPE 7 + + +// dummy value used for methods that return nothing (void) +#define EVALSTACK_VOID 0xff + +#endif \ No newline at end of file diff --git a/dna/Finalizer.c b/dna/Finalizer.c new file mode 100644 index 0000000..ab75f58 --- /dev/null +++ b/dna/Finalizer.c @@ -0,0 +1,48 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "Finalizer.h" + +static HEAP_PTR *ppToFinalize; +static int toFinalizeOfs, toFinalizeCapacity; + +void Finalizer_Init() { + toFinalizeCapacity = 4; + ppToFinalize = (HEAP_PTR*)malloc(toFinalizeCapacity * sizeof(void*)); + toFinalizeOfs = 0; +} + +void AddFinalizer(HEAP_PTR ptr) { + if (toFinalizeOfs >= toFinalizeCapacity) { + toFinalizeCapacity <<= 1; + ppToFinalize = realloc(ppToFinalize, toFinalizeCapacity * sizeof(void*)); + } + ppToFinalize[toFinalizeOfs++] = ptr; +} + +HEAP_PTR GetNextFinalizer() { + if (toFinalizeOfs == 0) { + return NULL; + } + return ppToFinalize[--toFinalizeOfs]; +} \ No newline at end of file diff --git a/dna/Finalizer.h b/dna/Finalizer.h new file mode 100644 index 0000000..f95d7ef --- /dev/null +++ b/dna/Finalizer.h @@ -0,0 +1,29 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined (__FINALIZER_H) +#define __FINALIZER_H + +void Finalizer_Init(); + +void AddFinalizer(PTR ptr); +HEAP_PTR GetNextFinalizer(); + +#endif \ No newline at end of file diff --git a/dna/Flags/en-GB.bmp b/dna/Flags/en-GB.bmp new file mode 100644 index 0000000..efe08ba --- /dev/null +++ b/dna/Flags/en-GB.bmp Binary files differ diff --git a/dna/Flags/en-GB.gif b/dna/Flags/en-GB.gif new file mode 100644 index 0000000..c0b3079 --- /dev/null +++ b/dna/Flags/en-GB.gif Binary files differ diff --git a/dna/Flags/en-GB.jpg b/dna/Flags/en-GB.jpg new file mode 100644 index 0000000..7f8269e --- /dev/null +++ b/dna/Flags/en-GB.jpg Binary files differ diff --git a/dna/Fonts/arial.ttf b/dna/Fonts/arial.ttf new file mode 100644 index 0000000..ff0815c --- /dev/null +++ b/dna/Fonts/arial.ttf Binary files differ diff --git a/dna/Fonts/tahoma.ttf b/dna/Fonts/tahoma.ttf new file mode 100644 index 0000000..f5a011e --- /dev/null +++ b/dna/Fonts/tahoma.ttf Binary files differ diff --git a/dna/Fonts/verdana.ttf b/dna/Fonts/verdana.ttf new file mode 100644 index 0000000..8f25a64 --- /dev/null +++ b/dna/Fonts/verdana.ttf Binary files differ diff --git a/dna/Generics.c b/dna/Generics.c new file mode 100644 index 0000000..b8c5812 --- /dev/null +++ b/dna/Generics.c @@ -0,0 +1,229 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "Generics.h" + +#include "MetaData.h" +#include "Types.h" +#include "Type.h" +#include "EvalStack.h" + +void Generic_GetHeapRoots(tHeapRoots *pHeapRoots, tMD_TypeDef *pTypeDef) { + tGenericInstance *pInst = pTypeDef->pGenericInstances; + while (pInst != NULL) { + tMD_TypeDef *pTypeDef = pInst->pInstanceTypeDef; + if (pTypeDef->staticFieldSize > 0) { + Heap_SetRoots(pHeapRoots, pTypeDef->pStaticFields, pTypeDef->staticFieldSize); + } + pInst = pInst->pNext; + } +} + +tMD_TypeDef* Generics_GetGenericTypeFromSig + (tMetaData *pMetaData, SIG *pSig, tMD_TypeDef **ppCallingClassTypeArgs, tMD_TypeDef **ppCallingMethodTypeArgs) { + tMD_TypeDef *pCoreType, *pRet; + U32 numTypeArgs, i; + tMD_TypeDef **ppTypeArgs; + + pCoreType = Type_GetTypeFromSig(pMetaData, pSig, ppCallingClassTypeArgs, ppCallingMethodTypeArgs); + MetaData_Fill_TypeDef(pCoreType, ppCallingClassTypeArgs, ppCallingMethodTypeArgs); //NULL, NULL); + + numTypeArgs = MetaData_DecodeSigEntry(pSig); + ppTypeArgs = (tMD_TypeDef**)malloc(numTypeArgs * sizeof(tMD_TypeDef*)); + for (i=0; ipMetaData, MAKE_TABLE_INDEX(MD_TABLE_GENERICPARAM, 1)); + + for (i=0; ipMetaData->tables.numRows[MD_TABLE_GENERICPARAM]; i++, pGenericParam++) { + if (pGenericParam->owner == pCoreType->tableIndex && pGenericParam->number == typeArgIndex) { + return pGenericParam; + } + } + return NULL; +} + +tMD_TypeDef* Generics_GetGenericTypeFromCoreType(tMD_TypeDef *pCoreType, U32 numTypeArgs, tMD_TypeDef **ppTypeArgs) { + tGenericInstance *pInst; + tMD_TypeDef *pTypeDef; + U32 i; + unsigned char name[2048]; + tMetaData *pMetaData; + + pMetaData = pCoreType->pMetaData; + MetaData_Fill_TypeDef(pCoreType, NULL, NULL); + + // See if we have already built an instantiation of this type with the given type args. + pInst = pCoreType->pGenericInstances; + while (pInst != NULL) { + if (pInst->numTypeArgs == numTypeArgs && + memcmp(pInst->pTypeArgs, ppTypeArgs, numTypeArgs * sizeof(tMD_TypeDef*)) == 0) { + return pInst->pInstanceTypeDef; + } + pInst = pInst->pNext; + } + + // This has not already been instantiated, so instantiate it now. + pInst = (tGenericInstance*)mallocForever(sizeof(tGenericInstance) + numTypeArgs * sizeof(tMD_TypeDef*)); + // Insert this into the chain of instantiations. + pInst->pNext = pCoreType->pGenericInstances; + pCoreType->pGenericInstances = pInst; + // Copy the type args into the instantiation. + pInst->numTypeArgs = numTypeArgs; + memcpy(pInst->pTypeArgs, ppTypeArgs, numTypeArgs * sizeof(tMD_TypeDef*)); + + // Create the new instantiated type + pInst->pInstanceTypeDef = pTypeDef = TMALLOCFOREVER(tMD_TypeDef); + memset(pTypeDef, 0, sizeof(tMD_TypeDef)); + // Make the name of the instantiation. + strcpy(name, pCoreType->name); + strcat(name, "["); + for (i=0; i 0) { + strcat(name, ","); + } + if (ppTypeArgs[i] != NULL) { + sprintf(strchr(name, 0), "%s.%s", ppTypeArgs[i]->nameSpace, ppTypeArgs[i]->name); + } else { + tMD_GenericParam *pGenericParam = FindGenericParam(pCoreType, i); + if (pGenericParam != NULL) { + sprintf(strchr(name, 0), pGenericParam->name); + } else { + sprintf(strchr(name, 0), "???"); + } + } + } + strcat(name, "]"); + // Fill in the basic bits of the new type def. + pTypeDef->pTypeDef = pTypeDef; + pTypeDef->pMetaData = pMetaData; + pTypeDef->flags = pCoreType->flags; + pTypeDef->pGenericDefinition = pCoreType; + for (i=0; iisGenericDefinition = 1; + break; + } + } + pTypeDef->nameSpace = pCoreType->nameSpace; + pTypeDef->name = (STRING)mallocForever((U32)strlen(name)+1); + strcpy(pTypeDef->name, name); + pTypeDef->ppClassTypeArgs = pInst->pTypeArgs; + pTypeDef->extends = pCoreType->extends; + pTypeDef->tableIndex = pCoreType->tableIndex; + pTypeDef->fieldList = pCoreType->fieldList; + pTypeDef->methodList = pCoreType->methodList; + pTypeDef->numFields = pCoreType->numFields; + pTypeDef->numMethods = pCoreType->numMethods; + pTypeDef->numVirtualMethods = pCoreType->numVirtualMethods; + pTypeDef->pNestedIn = pCoreType->pNestedIn; + pTypeDef->isPrimed = 1; + + MetaData_Fill_TypeDef_(pTypeDef, ppTypeArgs, NULL); + + return pTypeDef; +} + +tMD_MethodDef* Generics_GetMethodDefFromSpec + (tMD_MethodSpec *pMethodSpec, tMD_TypeDef **ppCallingClassTypeArgs, tMD_TypeDef **ppCallingMethodTypeArgs) { + + tMD_MethodDef *pCoreMethod, *pMethod; + SIG sig; + U32 argCount, i; + tMD_TypeDef **ppTypeArgs; + + pCoreMethod = MetaData_GetMethodDefFromDefRefOrSpec(pMethodSpec->pMetaData, pMethodSpec->method, NULL, NULL);//ppCallingClassTypeArgs, ppCallingMethodTypeArgs); + + //ppClassTypeArgs = pCoreMethod->pParentType->ppClassTypeArgs; + sig = MetaData_GetBlob(pMethodSpec->instantiation, NULL); + MetaData_DecodeSigEntry(&sig); // always 0x0a + argCount = MetaData_DecodeSigEntry(&sig); + ppTypeArgs = malloc(argCount * sizeof(tMD_TypeDef*)); + + for (i=0; ipMetaData, &sig, ppCallingClassTypeArgs, ppCallingMethodTypeArgs); + ppTypeArgs[i] = pArgType; + } + + pMethod = Generics_GetMethodDefFromCoreMethod(pCoreMethod, pCoreMethod->pParentType, argCount, ppTypeArgs); + free(ppTypeArgs); + + return pMethod; +} + +tMD_MethodDef* Generics_GetMethodDefFromCoreMethod + (tMD_MethodDef *pCoreMethod, tMD_TypeDef *pParentType, U32 numTypeArgs, tMD_TypeDef **ppTypeArgs) { + + tGenericMethodInstance *pInst; + tMD_MethodDef *pMethod; + + // See if we already have an instance with the given type args + pInst = pCoreMethod->pGenericMethodInstances; + while (pInst != NULL) { + if (pInst->numTypeArgs == numTypeArgs && + memcmp(pInst->pTypeArgs, ppTypeArgs, numTypeArgs * sizeof(tMD_TypeDef*)) == 0) { + return pInst->pInstanceMethodDef; + } + pInst = pInst->pNext; + } + + // We don't have an instance so create one now. + pInst = mallocForever(sizeof(tGenericMethodInstance) + numTypeArgs * sizeof(tMD_TypeDef*)); + pInst->pNext = pCoreMethod->pGenericMethodInstances; + pCoreMethod->pGenericMethodInstances = pInst; + pInst->numTypeArgs = numTypeArgs; + memcpy(pInst->pTypeArgs, ppTypeArgs, numTypeArgs * sizeof(tMD_TypeDef*)); + + pInst->pInstanceMethodDef = pMethod = TMALLOCFOREVER(tMD_MethodDef); + memset(pMethod, 0, sizeof(tMD_MethodDef)); + pMethod->pMethodDef = pMethod; + pMethod->pMetaData = pCoreMethod->pMetaData; + pMethod->pCIL = pCoreMethod->pCIL; + pMethod->implFlags = pCoreMethod->implFlags; + pMethod->flags = pCoreMethod->flags; + pMethod->name = pCoreMethod->name; + pMethod->signature = pCoreMethod->signature; + pMethod->vTableOfs = pCoreMethod->vTableOfs; + pMethod->ppMethodTypeArgs = pInst->pTypeArgs; + + MetaData_Fill_MethodDef(pParentType, pMethod, pParentType->ppClassTypeArgs, pInst->pTypeArgs); + + return pMethod; +} diff --git a/dna/Generics.h b/dna/Generics.h new file mode 100644 index 0000000..8007738 --- /dev/null +++ b/dna/Generics.h @@ -0,0 +1,65 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__GENERICS_H) +#define __GENERICS_H + +typedef struct tGenericInstance_ tGenericInstance; +typedef struct tGenericMethodInstance_ tGenericMethodInstance; + +#include "Types.h" +#include "MetaData.h" + + +struct tGenericInstance_ { + // The tMD_TypeDef for this instance of this generic type + tMD_TypeDef *pInstanceTypeDef; + + // The next instantiation of this generic type + tGenericInstance *pNext; + + // The number of type arguments for this instance + U32 numTypeArgs; + // The type arguments for this instantiation + tMD_TypeDef *pTypeArgs[0]; +}; + +struct tGenericMethodInstance_ { + // This instance method. + tMD_MethodDef *pInstanceMethodDef; + + // The next instantiation of this generic method + tGenericMethodInstance *pNext; + + // The number of type arguments for this instance + U32 numTypeArgs; + // The method type arguments for this instance + tMD_TypeDef *pTypeArgs[0]; +}; + +void Generic_GetHeapRoots(tHeapRoots *pHeapRoots, tMD_TypeDef *pTypeDef); + +tMD_TypeDef* Generics_GetGenericTypeFromSig(tMetaData *pMetaData, SIG *pSig, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppCallingMethodTypeArgs); +tMD_TypeDef* Generics_GetGenericTypeFromCoreType(tMD_TypeDef *pCoreType, U32 numArgs, tMD_TypeDef **ppTypeArgs);//, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs); + +tMD_MethodDef* Generics_GetMethodDefFromSpec(tMD_MethodSpec *pMethodSpec, tMD_TypeDef **ppCallingClassTypeArgs, tMD_TypeDef **ppCallingMethodTypeArgs); +tMD_MethodDef* Generics_GetMethodDefFromCoreMethod(tMD_MethodDef *pCoreMethod, tMD_TypeDef *pParentType, U32 numMethodTypeArgs, tMD_TypeDef **ppMethodTypeArgs); + +#endif \ No newline at end of file diff --git a/dna/Heap.c b/dna/Heap.c new file mode 100644 index 0000000..93faf0b --- /dev/null +++ b/dna/Heap.c @@ -0,0 +1,600 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "Heap.h" + +#include "MetaData.h" +#include "CLIFile.h" +#include "Type.h" +#include "EvalStack.h" +#include "Finalizer.h" +#include "Thread.h" +#include "System.String.h" +#include "System.Array.h" +#include "System.WeakReference.h" + +// Memory roots are: +// All threads, all MethodStates - the ParamLocals memory and the evaluation stack +// All static fields of all types +// Note that the evaluation stack is not typed, so every 4-byte entry is treated as a pointer + +typedef struct tSync_ tSync; +typedef struct tHeapEntry_ tHeapEntry; + +struct tSync_ { + // The thread that holds this sync block + tThread *pThread; + // The number of times this thread has entered the sync block + U32 count; + + // Link to the first weak-ref that targets this object. + // This allows the tracking of all weak-refs that target this object. + HEAP_PTR weakRef; +}; + +// The memory is kept track of using a balanced binary search tree (ordered by memory address) +// See http://www.eternallyconfuzzled.com/tuts/datastructures/jsw_tut_andersson.aspx for details. + +struct tHeapEntry_ { + // Left/right links in the heap binary tree + tHeapEntry *pLink[2]; + // The 'level' of this node. Leaf nodes have lowest level + U8 level; + // Used to mark that this node is still in use. + // If this is set to 0xff, then this heap entry is undeletable. + U8 marked; + // Set to 1 if the Finalizer needs to be run. + // Set to 2 if this has been added to the Finalizer queue + // Set to 0 when the Finalizer has been run (or there is no Finalizer in the first place) + // Only set on types that have a Finalizer + U8 needToFinalize; + + // unused + U8 padding; + + // The type in this heap entry + tMD_TypeDef *pTypeDef; + + // Used for locking sync, and tracking WeakReference that point to this object + tSync *pSync; + + // The user memory + U8 memory[0]; +}; +// Get the tHeapEntry pointer when given a HEAP_PTR object +#define GET_HEAPENTRY(heapObj) ((tHeapEntry*)(heapObj - sizeof(tHeapEntry))) + +// Forward ref +static void RemoveWeakRefTarget(tHeapEntry *pHeapEntry, U32 removeLongRefs); + +static tHeapEntry *pHeapTreeRoot; +static tHeapEntry *nil; +#define MAX_TREE_DEPTH 40 + +// The total heap memory currently allocated +static U32 trackHeapSize; +// The max heap size allowed before a garbage collection is triggered +static U32 heapSizeMax; +// The number of allocated memory nodes +static U32 numNodes = 0; +// The number of collections done +static U32 numCollections = 0; + +#ifdef DIAG_GC +// Track how much time GC's are taking +U64 gcTotalTime = 0; +#endif + +#define MIN_HEAP_SIZE 50000 +#define MAX_HEAP_EXCESS 200000 + +void Heap_Init() { + // Initialise vars + trackHeapSize = 0; + heapSizeMax = MIN_HEAP_SIZE; + // Create nil node - for leaf termination + nil = TMALLOCFOREVER(tHeapEntry); + memset(nil, 0, sizeof(tHeapEntry)); + nil->pLink[0] = nil->pLink[1] = nil; + // Set the heap tree as empty + pHeapTreeRoot = nil; +} + +// Get the size of a heap entry, NOT including the header +// This works by returning the size of the type, unless the type is an array or a string, +// which are the only two types that can have variable sizes +static U32 GetSize(tHeapEntry *pHeapEntry) { + tMD_TypeDef *pType = pHeapEntry->pTypeDef; + if (pType == types[TYPE_SYSTEM_STRING]) { + // If it's a string, return the string length in bytes + return SystemString_GetNumBytes((HEAP_PTR)(pHeapEntry + 1)); + } + if (TYPE_ISARRAY(pType)) { + // If it's an array, return the array length * array element size + return SystemArray_GetNumBytes((HEAP_PTR)(pHeapEntry + 1), pType->pArrayElementType); + } + // If it's not string or array, just return the instance memory size + return pType->instanceMemSize; +} + +static tHeapEntry* TreeSkew(tHeapEntry *pRoot) { + if (pRoot->pLink[0]->level == pRoot->level && pRoot->level != 0) { + tHeapEntry *pSave = pRoot->pLink[0]; + pRoot->pLink[0] = pSave->pLink[1]; + pSave->pLink[1] = pRoot; + pRoot = pSave; + } + return pRoot; +} + +static tHeapEntry* TreeSplit(tHeapEntry *pRoot) { + if (pRoot->pLink[1]->pLink[1]->level == pRoot->level && pRoot->level != 0) { + tHeapEntry *pSave = pRoot->pLink[1]; + pRoot->pLink[1] = pSave->pLink[0]; + pSave->pLink[0] = pRoot; + pRoot = pSave; + pRoot->level++; + } + return pRoot; +} + +static tHeapEntry* TreeInsert(tHeapEntry *pRoot, tHeapEntry *pEntry) { + if (pRoot == nil) { + pRoot = pEntry; + pRoot->level = 1; + pRoot->pLink[0] = pRoot->pLink[1] = nil; + pRoot->marked = 0; + } else { + tHeapEntry *pNode = pHeapTreeRoot; + tHeapEntry *pUp[MAX_TREE_DEPTH]; + I32 top = 0, dir; + // Find leaf position to insert into tree. This first step is unbalanced + for (;;) { + pUp[top++] = pNode; + dir = pNode < pEntry; // 0 for left, 1 for right + if (pNode->pLink[dir] == nil) { + break; + } + pNode = pNode->pLink[dir]; + } + // Create new node + pNode->pLink[dir] = pEntry; + pEntry->level = 1; + pEntry->pLink[0] = pEntry->pLink[1] = nil; + pEntry->marked = 0; + // Balance the tree + while (--top >= 0) { + if (top != 0) { + dir = pUp[top-1]->pLink[1] == pUp[top]; + } + pUp[top] = TreeSkew(pUp[top]); + pUp[top] = TreeSplit(pUp[top]); + if (top != 0) { + pUp[top-1]->pLink[dir] = pUp[top]; + } else { + pRoot = pUp[0]; + } + } + } + return pRoot; +} + +static tHeapEntry* TreeRemove(tHeapEntry *pRoot, tHeapEntry *pDelete) { + if (pRoot != nil) { + if (pRoot == pDelete) { + if (pRoot->pLink[0] != nil && pRoot->pLink[1] != nil) { + tHeapEntry *pL0; + U8 l; + tHeapEntry *pHeir = pRoot->pLink[0], **ppHeirLink = &pHeir->pLink[0]; + while (pHeir->pLink[1] != nil) { + ppHeirLink = &pHeir->pLink[1]; + pHeir = pHeir->pLink[1]; + } + // Swap the two nodes + pL0 = pHeir->pLink[0]; + l = pHeir->level; + // Bring heir to replace root + pHeir->pLink[0] = pRoot->pLink[0]; + pHeir->pLink[1] = pRoot->pLink[1]; + pHeir->level = pRoot->level; + // Send root to replace heir + *ppHeirLink = pRoot; + pRoot->pLink[0] = pL0; + pRoot->pLink[1] = nil; + pRoot->level = l; + // Set correct return value + pL0 = pRoot; + pRoot = pHeir; + // Delete the node that's been sent down + pRoot->pLink[0] = TreeRemove(pRoot->pLink[0], pL0); + } else { + pRoot = pRoot->pLink[pRoot->pLink[0] == nil]; + } + } else { + I32 dir = pRoot < pDelete; + pRoot->pLink[dir] = TreeRemove(pRoot->pLink[dir], pDelete); + } + } + + if (pRoot->pLink[0]->level < pRoot->level-1 || pRoot->pLink[1]->level < pRoot->level-1) { + if (pRoot->pLink[1]->level > --pRoot->level) { + pRoot->pLink[1]->level = pRoot->level; + } + pRoot = TreeSkew(pRoot); + pRoot->pLink[1] = TreeSkew(pRoot->pLink[1]); + pRoot->pLink[1]->pLink[1] = TreeSkew(pRoot->pLink[1]->pLink[1]); + pRoot = TreeSplit(pRoot); + pRoot->pLink[1] = TreeSplit(pRoot->pLink[1]); + } + + return pRoot; +} + +static void GarbageCollect() { + tHeapRoots heapRoots; + tHeapEntry *pNode; + tHeapEntry *pUp[MAX_TREE_DEPTH * 2]; + I32 top; + tHeapEntry *pToDelete = NULL; + U32 orgHeapSize = trackHeapSize; + U32 orgNumNodes = numNodes; +#ifdef DIAG_GC + U64 startTime; +#endif + + numCollections++; + +#ifdef DIAG_GC + startTime = microTime(); +#endif + + heapRoots.capacity = 64; + heapRoots.num = 0; + heapRoots.pHeapEntries = malloc(heapRoots.capacity * sizeof(tHeapRootEntry)); + + Thread_GetHeapRoots(&heapRoots); + CLIFile_GetHeapRoots(&heapRoots); + + // Mark phase + while (heapRoots.num > 0) { + tHeapRootEntry *pRootsEntry; + U32 i; + U32 moreRootsAdded = 0; + U32 rootsEntryNumPointers; + void **pRootsEntryMem; + + // Get a piece of memory off the list of heap memory roots. + pRootsEntry = &heapRoots.pHeapEntries[heapRoots.num - 1]; + rootsEntryNumPointers = pRootsEntry->numPointers; + pRootsEntryMem = pRootsEntry->pMem; + // Mark this entry as done + pRootsEntry->numPointers = 0; + pRootsEntry->pMem = NULL; + // Iterate through all pointers in it + for (i=0; i, not >= as might be expected, + // to allow for a zero-sized memory to be detected (and not garbage collected) properly. + // E.g. The object class has zero memory. + pNode = pHeapTreeRoot; + while (pNode != nil) { + if (pMemRef < (void*)pNode) { + pNode = pNode->pLink[0]; + } else if ((char*)pMemRef > ((char*)pNode) + GetSize(pNode) + sizeof(tHeapEntry)) { + pNode = pNode->pLink[1]; + } else { + // Found memory. See if it's already been marked. + // If it's already marked, then don't do anything. + // It it's not marked, then add all of its memory to the roots, and mark it. + if (pNode->marked == 0) { + tMD_TypeDef *pType = pNode->pTypeDef; + + // Not yet marked, so mark it, and add it to heap roots. + pNode->marked = 1; + + // Don't look at the contents of strings, arrays of primitive types, or WeakReferences + if (pType->stackType == EVALSTACK_O || + pType->stackType == EVALSTACK_VALUETYPE || + pType->stackType == EVALSTACK_PTR) { + + if (pType != types[TYPE_SYSTEM_STRING] && + (!TYPE_ISARRAY(pType) || + pType->pArrayElementType->stackType == EVALSTACK_O || + pType->pArrayElementType->stackType == EVALSTACK_VALUETYPE || + pType->pArrayElementType->stackType == EVALSTACK_PTR)) { + + if (pType != types[TYPE_SYSTEM_WEAKREFERENCE]) { + Heap_SetRoots(&heapRoots,pNode->memory, GetSize(pNode)); + moreRootsAdded = 1; + } + } + } + } + break; + } + } + } + if (!moreRootsAdded) { + heapRoots.num--; + } + } + + free(heapRoots.pHeapEntries); + + // Sweep phase + // Traverse nodes + pUp[0] = pHeapTreeRoot; + top = 1; + while (top != 0) { + // Get this node + pNode = pUp[--top]; + // Act on this node + if (pNode->marked) { + if (pNode->marked != 0xff) { + // Still in use (but not marked undeletable), so unmark + pNode->marked = 0; + } + } else { + // Not in use any more, so put in deletion queue if it does not need Finalizing + // If it does need Finalizing, then don't garbage collect, and put in Finalization queue. + if (pNode->needToFinalize) { + if (pNode->needToFinalize == 1) { + AddFinalizer((HEAP_PTR)pNode + sizeof(tHeapEntry)); + // Mark it has having been placed in the finalization queue. + // When it has been finalized, then this will be set to 0 + pNode->needToFinalize = 2; + // If this object is being targetted by weak-ref(s), handle it + if (pNode->pSync != NULL) { + RemoveWeakRefTarget(pNode, 0); + free(pNode->pSync); + } + } + } else { + // If this object is being targetted by weak-ref(s), handle it + if (pNode->pSync != NULL) { + RemoveWeakRefTarget(pNode, 1); + free(pNode->pSync); + } + // Use pSync to point to next entry in this linked-list. + (tHeapEntry*)(pNode->pSync) = pToDelete; + pToDelete = pNode; + } + } + // Get next node(s) + if (pNode->pLink[1] != nil) { + pUp[top++] = pNode->pLink[1]; + } + if (pNode->pLink[0] != nil) { + pUp[top++] = pNode->pLink[0]; + } + } + + // Delete all unused memory nodes. + while (pToDelete != NULL) { + tHeapEntry *pThis = pToDelete; + pToDelete = (tHeapEntry*)(pToDelete->pSync); + pHeapTreeRoot = TreeRemove(pHeapTreeRoot, pThis); + numNodes--; + trackHeapSize -= GetSize(pThis) + sizeof(tHeapEntry); + free(pThis); + } + +#ifdef DIAG_GC + gcTotalTime += microTime() - startTime; +#endif + + log_f(1, "--- GARBAGE --- [Size: %d -> %d] [Nodes: %d -> %d]\n", + orgHeapSize, trackHeapSize, orgNumNodes, numNodes); + +#ifdef DIAG_GC + log_f(1, "GC time = %d ms\n", gcTotalTime / 1000); +#endif +} + +void Heap_UnmarkFinalizer(HEAP_PTR heapPtr) { + ((tHeapEntry*)(heapPtr - sizeof(tHeapEntry)))->needToFinalize = 0; +} + +void Heap_GarbageCollect() { + GarbageCollect(); +} + +U32 Heap_NumCollections() { + return numCollections; +} + +U32 Heap_GetTotalMemory() { + return trackHeapSize; +} + +void Heap_SetRoots(tHeapRoots *pHeapRoots, void *pRoots, U32 sizeInBytes) { + tHeapRootEntry *pRootEntry; + + Assert((sizeInBytes & 0x3) == 0); + if (pHeapRoots->num >= pHeapRoots->capacity) { + pHeapRoots->capacity <<= 1; + pHeapRoots->pHeapEntries = (tHeapRootEntry*)realloc(pHeapRoots->pHeapEntries, pHeapRoots->capacity * sizeof(tHeapRootEntry)); + } + pRootEntry = &pHeapRoots->pHeapEntries[pHeapRoots->num++]; + pRootEntry->numPointers = sizeInBytes >> 2; + pRootEntry->pMem = pRoots; +} + +HEAP_PTR Heap_Alloc(tMD_TypeDef *pTypeDef, U32 size) { + tHeapEntry *pHeapEntry; + U32 totalSize; + + totalSize = sizeof(tHeapEntry) + size; + + // Trigger garbage collection if required. + if (trackHeapSize >= heapSizeMax) { + GarbageCollect(); + heapSizeMax = (trackHeapSize + totalSize) << 1; + if (heapSizeMax < trackHeapSize + totalSize + MIN_HEAP_SIZE) { + // Make sure there is always MIN_HEAP_SIZE available to allocate on the heap + heapSizeMax = trackHeapSize + totalSize + MIN_HEAP_SIZE; + } + if (heapSizeMax > trackHeapSize + totalSize + MAX_HEAP_EXCESS) { + // Make sure there is never more that MAX_HEAP_EXCESS space on the heap + heapSizeMax = trackHeapSize + totalSize + MAX_HEAP_EXCESS; + } + } + + pHeapEntry = (tHeapEntry*)malloc(totalSize); + pHeapEntry->pTypeDef = pTypeDef; + pHeapEntry->pSync = NULL; + pHeapEntry->needToFinalize = (pTypeDef->pFinalizer != NULL); + memset(pHeapEntry->memory, 0, size); + trackHeapSize += totalSize; + + pHeapTreeRoot = TreeInsert(pHeapTreeRoot, pHeapEntry); + numNodes++; + + return pHeapEntry->memory; +} + +HEAP_PTR Heap_AllocType(tMD_TypeDef *pTypeDef) { + //printf("Heap_AllocType('%s')\n", pTypeDef->name); + return Heap_Alloc(pTypeDef, pTypeDef->instanceMemSize); +} + +tMD_TypeDef* Heap_GetType(HEAP_PTR heapEntry) { + tHeapEntry *pHeapEntry = GET_HEAPENTRY(heapEntry); + return pHeapEntry->pTypeDef; +} + +void Heap_MakeUndeletable(HEAP_PTR heapEntry) { + tHeapEntry *pHeapEntry = GET_HEAPENTRY(heapEntry); + pHeapEntry->marked = 0xff; +} + +void Heap_MakeDeletable(HEAP_PTR heapEntry) { + tHeapEntry *pHeapEntry = GET_HEAPENTRY(heapEntry); + pHeapEntry->marked = 0; +} + +HEAP_PTR Heap_Box(tMD_TypeDef *pType, PTR pMem) { + HEAP_PTR boxed; + + boxed = Heap_AllocType(pType); + memcpy(boxed, pMem, pType->instanceMemSize); + + return boxed; +} + +HEAP_PTR Heap_Clone(HEAP_PTR obj) { + tHeapEntry *pObj = GET_HEAPENTRY(obj); + HEAP_PTR clone; + U32 size = GetSize(pObj); + + clone = Heap_Alloc(pObj->pTypeDef, size); + memcpy(clone, pObj->memory, size); + + return clone; +} + +static tSync* EnsureSync(tHeapEntry *pHeapEntry) { + if (pHeapEntry->pSync == NULL) { + tSync *pSync = TMALLOC(tSync); + memset(pSync, 0, sizeof(tSync)); + pHeapEntry->pSync = pSync; + } + return pHeapEntry->pSync; +} + +static void DeleteSync(tHeapEntry *pHeapEntry) { + if (pHeapEntry->pSync != NULL) { + if (pHeapEntry->pSync->count == 0 && pHeapEntry->pSync->weakRef == NULL) { + free(pHeapEntry->pSync); + pHeapEntry->pSync = NULL; + } + } +} + +// Return 1 if lock succesfully got +// Return 0 if couldn't get the lock this time +U32 Heap_SyncTryEnter(HEAP_PTR obj) { + tHeapEntry *pHeapEntry = GET_HEAPENTRY(obj); + tThread *pThread = Thread_GetCurrent(); + tSync *pSync; + + pSync = EnsureSync(pHeapEntry); + if (pSync->pThread == NULL) { + pSync->pThread = pThread; + pSync->count = 1; + return 1; + } + if (pSync->pThread == pThread) { + pSync->count++; + return 1; + } + return 0; +} + +// Returns 1 if all is OK +// Returns 0 if the wrong thread is releasing the sync, or if no thread hold the sync +U32 Heap_SyncExit(HEAP_PTR obj) { + tHeapEntry *pHeapEntry = GET_HEAPENTRY(obj); + tThread *pThread = Thread_GetCurrent(); + if (pHeapEntry->pSync == NULL) { + return 0; + } + if (pHeapEntry->pSync->pThread != pThread) { + return 0; + } + if (--pHeapEntry->pSync->count == 0) { + DeleteSync(pHeapEntry); + } + return 1; +} + +static void RemoveWeakRefTarget(tHeapEntry *pTarget, U32 removeLongRefs) { + SystemWeakReference_TargetGone(&pTarget->pSync->weakRef, removeLongRefs); +} + +// Returns the previous first weak-ref in target targetted by weakref +HEAP_PTR Heap_SetWeakRefTarget(HEAP_PTR target, HEAP_PTR weakRef) { + tHeapEntry *pTarget = GET_HEAPENTRY(target); + tSync *pSync; + HEAP_PTR prevWeakRef; + + pSync = EnsureSync(pTarget); + prevWeakRef = pSync->weakRef; + pSync->weakRef = weakRef; + return prevWeakRef; +} + +HEAP_PTR* Heap_GetWeakRefAddress(HEAP_PTR target) { + tHeapEntry *pTarget = GET_HEAPENTRY(target); + return &pTarget->pSync->weakRef; +} + +void Heap_RemovedWeakRefTarget(HEAP_PTR target) { + tHeapEntry *pTarget = GET_HEAPENTRY(target); + DeleteSync(pTarget); +} diff --git a/dna/Heap.h b/dna/Heap.h new file mode 100644 index 0000000..ebf5b31 --- /dev/null +++ b/dna/Heap.h @@ -0,0 +1,68 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__HEAP_H) +#define __HEAP_H + +#include "MetaData.h" +#include "Types.h" + +typedef struct tHeapRoots_ tHeapRoots; +typedef struct tHeapRootEntry_ tHeapRootEntry; + +#ifdef DIAG_GC +extern U64 gcTotalTime; +#endif + +struct tHeapRootEntry_ { + U32 numPointers; // The number of pointers within this memory area + void **pMem; +}; + +struct tHeapRoots_ { + U32 capacity; + U32 num; + tHeapRootEntry *pHeapEntries; +}; + +void Heap_Init(); +void Heap_SetRoots(tHeapRoots *pHeapRoots, void *pRoots, U32 sizeInBytes); +void Heap_UnmarkFinalizer(HEAP_PTR heapPtr); +void Heap_GarbageCollect(); +U32 Heap_NumCollections(); +U32 Heap_GetTotalMemory(); + +HEAP_PTR Heap_Alloc(tMD_TypeDef *pTypeDef, U32 size); +HEAP_PTR Heap_AllocType(tMD_TypeDef *pTypeDef); +void Heap_MakeUndeletable(HEAP_PTR heapEntry); +void Heap_MakeDeletable(HEAP_PTR heapEntry); + +tMD_TypeDef* Heap_GetType(HEAP_PTR heapEntry); + +HEAP_PTR Heap_Box(tMD_TypeDef *pType, PTR pMem); +HEAP_PTR Heap_Clone(HEAP_PTR obj); + +U32 Heap_SyncTryEnter(HEAP_PTR obj); +U32 Heap_SyncExit(HEAP_PTR obj); + +HEAP_PTR Heap_SetWeakRefTarget(HEAP_PTR target, HEAP_PTR weakRef); +HEAP_PTR* Heap_GetWeakRefAddress(HEAP_PTR target); +void Heap_RemovedWeakRefTarget(HEAP_PTR target); +#endif \ No newline at end of file diff --git a/dna/Images/Test1-24bpp.bmp b/dna/Images/Test1-24bpp.bmp new file mode 100644 index 0000000..0c6475e --- /dev/null +++ b/dna/Images/Test1-24bpp.bmp Binary files differ diff --git a/dna/Images/Test1-32bpp.bmp b/dna/Images/Test1-32bpp.bmp new file mode 100644 index 0000000..812e4f8 --- /dev/null +++ b/dna/Images/Test1-32bpp.bmp Binary files differ diff --git a/dna/Images/Test1-4bpp-rgb.bmp b/dna/Images/Test1-4bpp-rgb.bmp new file mode 100644 index 0000000..4e21e82 --- /dev/null +++ b/dna/Images/Test1-4bpp-rgb.bmp Binary files differ diff --git a/dna/Images/Test1-4bpp-rle.bmp b/dna/Images/Test1-4bpp-rle.bmp new file mode 100644 index 0000000..5e44998 --- /dev/null +++ b/dna/Images/Test1-4bpp-rle.bmp Binary files differ diff --git a/dna/Images/Test1-8bpp-rgb.bmp b/dna/Images/Test1-8bpp-rgb.bmp new file mode 100644 index 0000000..0980cba --- /dev/null +++ b/dna/Images/Test1-8bpp-rgb.bmp Binary files differ diff --git a/dna/Images/Test1-8bpp-rle.bmp b/dna/Images/Test1-8bpp-rle.bmp new file mode 100644 index 0000000..990edd8 --- /dev/null +++ b/dna/Images/Test1-8bpp-rle.bmp Binary files differ diff --git a/dna/Images/Test1-IL-nonTrans.gif b/dna/Images/Test1-IL-nonTrans.gif new file mode 100644 index 0000000..792a98d --- /dev/null +++ b/dna/Images/Test1-IL-nonTrans.gif Binary files differ diff --git a/dna/Images/Test1-nonIL-nonTrans.gif b/dna/Images/Test1-nonIL-nonTrans.gif new file mode 100644 index 0000000..015481b --- /dev/null +++ b/dna/Images/Test1-nonIL-nonTrans.gif Binary files differ diff --git a/dna/Images/Test1.jpg b/dna/Images/Test1.jpg new file mode 100644 index 0000000..920e326 --- /dev/null +++ b/dna/Images/Test1.jpg Binary files differ diff --git a/dna/InternalCall.c b/dna/InternalCall.c new file mode 100644 index 0000000..51739c5 --- /dev/null +++ b/dna/InternalCall.c @@ -0,0 +1,207 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "InternalCall.h" +#include "MetaData.h" +#include "Type.h" + +#include "System.String.h" +#include "System.Object.h" +#include "System.Console.h" +#include "System.Array.h" +#include "System.Environment.h" +#include "System.Runtime.CompilerServices.RuntimeHelpers.h" +#include "System.ValueType.h" +#include "System.RuntimeType.h" +#include "System.Type.h" +#include "System.Threading.Monitor.h" +#include "System.Threading.Thread.h" +#include "System.Threading.Interlocked.h" +#include "System.Enum.h" +#include "System.WeakReference.h" +#include "System.GC.h" +#include "System.IO.FileInternal.h" +#include "System.Char.h" +#include "System.Diagnostics.Debugger.h" +#include "System.Net.Sockets.Socket.h" +#include "System.Net.Dns.h" +#include "System.DateTime.h" +#include "System.Math.h" +#include "Delegate.h" + +#define MAX_PARAMS 6 + +typedef struct tInternalCall_ tInternalCall; +struct tInternalCall_ { + STRING nameSpace; + STRING type; + STRING method; + fnInternalCall fn; + U8 returnType; + U8 numParameters; + U8 parameterTypes[MAX_PARAMS]; +}; + +static tInternalCall internalCalls[] = { + {"System", "Object", "Equals", System_Object_Equals, TYPE_SYSTEM_BOOLEAN, 1, {TYPE_SYSTEM_OBJECT}}, + {NULL, NULL, "Clone", System_Object_Clone, TYPE_SYSTEM_OBJECT, 1, {TYPE_SYSTEM_OBJECT}}, + {NULL, NULL, "GetHashCode", System_Object_GetHashCode, TYPE_SYSTEM_INT32, 0}, + {NULL, NULL, "GetType", System_Object_GetType, TYPE_SYSTEM_TYPE, 0}, + + {NULL, "String", ".ctor", System_String_ctor_CharInt32, TYPE_SYSTEM_VOID, 2, {TYPE_SYSTEM_CHAR, TYPE_SYSTEM_INT32}}, + {NULL, NULL, ".ctor", System_String_ctor_CharAIntInt, TYPE_SYSTEM_VOID, 3, {TYPE_SYSTEM_ARRAY_CHAR, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INT32}}, + {NULL, NULL, ".ctor", System_String_ctor_StringIntInt, TYPE_SYSTEM_VOID, 3, {TYPE_SYSTEM_STRING, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INT32}}, + {NULL, NULL, "get_Chars", System_String_get_Chars, TYPE_SYSTEM_CHAR, 1, {TYPE_SYSTEM_INT32}}, + {NULL, NULL, "InternalConcat", System_String_InternalConcat, TYPE_SYSTEM_STRING, 2, {TYPE_SYSTEM_STRING, TYPE_SYSTEM_STRING}}, + {NULL, NULL, "InternalTrim", System_String_InternalTrim, TYPE_SYSTEM_STRING, 2, {TYPE_SYSTEM_ARRAY_CHAR, TYPE_SYSTEM_INT32}}, + {NULL, NULL, "Equals", System_String_Equals, TYPE_SYSTEM_BOOLEAN, 2, {TYPE_SYSTEM_STRING, TYPE_SYSTEM_STRING}}, + {NULL, NULL, "GetHashCode", System_String_GetHashCode, TYPE_SYSTEM_INT32, 0}, + {NULL, NULL, "InternalReplace", System_String_InternalReplace, TYPE_SYSTEM_STRING, 2, {TYPE_SYSTEM_STRING, TYPE_SYSTEM_STRING}}, + {NULL, NULL, "InternalIndexOf", System_String_InternalIndexOf, TYPE_SYSTEM_INT32, 4, {TYPE_SYSTEM_CHAR, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INT32, TYPE_SYSTEM_BOOLEAN}}, + {NULL, NULL, "InternalIndexOfAny", System_String_InternalIndexOfAny, TYPE_SYSTEM_INT32, 4, {TYPE_SYSTEM_ARRAY_CHAR, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INT32, TYPE_SYSTEM_BOOLEAN}}, + + {NULL, "Array", "Internal_GetValue", System_Array_Internal_GetValue, TYPE_SYSTEM_OBJECT, 1, {TYPE_SYSTEM_INT32}}, + {NULL, NULL, "Internal_SetValue", System_Array_Internal_SetValue, TYPE_SYSTEM_BOOLEAN, 2, {TYPE_SYSTEM_OBJECT, TYPE_SYSTEM_INT32}}, + {NULL, NULL, "Clear", System_Array_Clear, TYPE_SYSTEM_VOID, 3, {TYPE_SYSTEM_ARRAY_NO_TYPE, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INT32}}, + {NULL, NULL, "Internal_Copy", System_Array_Internal_Copy, TYPE_SYSTEM_BOOLEAN, 5, {TYPE_SYSTEM_ARRAY_NO_TYPE, TYPE_SYSTEM_INT32, TYPE_SYSTEM_ARRAY_NO_TYPE, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INT32}}, + {NULL, NULL, "Resize", System_Array_Resize, TYPE_SYSTEM_VOID, 2, {TYPE_SYSTEM_INTPTR, TYPE_SYSTEM_INT32}}, + {NULL, NULL, "Reverse", System_Array_Reverse, TYPE_SYSTEM_VOID, 3, {TYPE_SYSTEM_ARRAY_NO_TYPE, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INT32}}, + + {NULL, "Console", "Write", System_Console_Write, TYPE_SYSTEM_VOID, 1, {TYPE_SYSTEM_STRING}}, + {NULL, NULL , "Internal_ReadKey", System_Console_Internal_ReadKey, TYPE_SYSTEM_INT32, 0}, + {NULL, NULL , "Internal_KeyAvailable", System_Console_Internal_KeyAvailable, TYPE_SYSTEM_BOOLEAN, 0}, + + {NULL, "Environment", "get_TickCount", System_Environment_get_TickCount, TYPE_SYSTEM_INT32, 0}, + {NULL, NULL , "GetOSVersionString", System_Environment_GetOSVersionString, TYPE_SYSTEM_STRING, 0}, + {NULL, NULL , "get_Platform", System_Environment_get_Platform, TYPE_SYSTEM_PLATFORMID, 0}, + + {NULL, "Type", "GetTypeFromHandle", System_Type_GetTypeFromHandle, TYPE_SYSTEM_TYPE, 1, {TYPE_SYSTEM_RUNTIMETYPEHANDLE}}, + {NULL, NULL, "get_IsValueType", System_Type_get_IsValueType, TYPE_SYSTEM_BOOLEAN, 0}, + + {NULL, "RuntimeType", "get_Name", System_RuntimeType_get_Name, TYPE_SYSTEM_STRING, 0}, + {NULL, NULL, "get_Namespace", System_RuntimeType_get_Namespace, TYPE_SYSTEM_STRING, 0}, + {NULL, NULL, "GetNestingParentType", System_RuntimeType_GetNestingParentType, TYPE_SYSTEM_RUNTIMETYPE, 0}, + {NULL, NULL, "get_BaseType", System_RuntimeType_get_BaseType, TYPE_SYSTEM_TYPE, 0}, + {NULL, NULL, "get_IsEnum", System_RuntimeType_get_IsEnum, TYPE_SYSTEM_BOOLEAN, 0}, + {NULL, NULL, "get_IsGenericType", System_RuntimeType_get_IsGenericType, TYPE_SYSTEM_BOOLEAN, 0}, + {NULL, NULL, "Internal_GetGenericTypeDefinition", System_RuntimeType_Internal_GetGenericTypeDefinition, TYPE_SYSTEM_RUNTIMETYPE, 0}, + {NULL, NULL, "GetGenericArguments", System_RuntimeType_GetGenericArguments, TYPE_SYSTEM_ARRAY_TYPE, 0}, + + {NULL, "Char", "GetUnicodeCategory", System_Char_GetUnicodeCategory, TYPE_SYSTEM_GLOBALIZATION_UNICODECATEGORY, 1, {TYPE_SYSTEM_CHAR}}, + {NULL, NULL , "ToLowerInvariant", System_Char_ToLowerInvariant, TYPE_SYSTEM_CHAR, 1, {TYPE_SYSTEM_CHAR}}, + {NULL, NULL , "ToUpperInvariant", System_Char_ToUpperInvariant, TYPE_SYSTEM_CHAR, 1, {TYPE_SYSTEM_CHAR}}, + + {NULL, "GC", "Collect", System_GC_Collect, TYPE_SYSTEM_VOID, 0}, + {NULL, NULL, "Internal_CollectionCount", System_GC_Internal_CollectionCount, TYPE_SYSTEM_INT32, 0}, + {NULL, NULL, "GetTotalMemory", System_GC_GetTotalMemory, TYPE_SYSTEM_INT64, 1, {TYPE_SYSTEM_BOOLEAN}}, + {NULL, NULL, "SuppressFinalize", System_GC_SuppressFinalize, TYPE_SYSTEM_VOID, 1, {TYPE_SYSTEM_OBJECT}}, + + {NULL, "Enum", "Internal_GetValue", System_Enum_Internal_GetValue, TYPE_SYSTEM_INT32, 0}, + {NULL, NULL, "Internal_GetInfo", System_Enum_Internal_GetInfo, TYPE_SYSTEM_VOID, 3, {TYPE_SYSTEM_TYPE, TYPE_SYSTEM_INTPTR, TYPE_SYSTEM_INTPTR}}, + + {NULL, "ValueType", "GetFields", System_ValueType_GetFields, TYPE_SYSTEM_ARRAY_NO_TYPE, 2, {TYPE_SYSTEM_OBJECT, TYPE_SYSTEM_OBJECT}}, + + {NULL, "WeakReference", "get_Target", System_WeakReference_get_Target, TYPE_SYSTEM_OBJECT, 0}, + {NULL, NULL, "set_Target", System_WeakReference_set_Target, TYPE_SYSTEM_VOID, 1, {TYPE_SYSTEM_OBJECT}}, + + {NULL, "DateTime", "InternalUtcNow", System_DateTime_InternalUtcNow, TYPE_SYSTEM_INT64, 0}, + + {NULL, "Math", "Sin", System_Math_Sin, TYPE_SYSTEM_DOUBLE, 1, {TYPE_SYSTEM_DOUBLE}}, + {NULL, NULL, "Cos", System_Math_Cos, TYPE_SYSTEM_DOUBLE, 1, {TYPE_SYSTEM_DOUBLE}}, + {NULL, NULL, "Tan", System_Math_Tan, TYPE_SYSTEM_DOUBLE, 1, {TYPE_SYSTEM_DOUBLE}}, + {NULL, NULL, "Pow", System_Math_Pow, TYPE_SYSTEM_DOUBLE, 2, {TYPE_SYSTEM_DOUBLE, TYPE_SYSTEM_DOUBLE}}, + {NULL, NULL, "Sqrt", System_Math_Sqrt, TYPE_SYSTEM_DOUBLE, 1, {TYPE_SYSTEM_DOUBLE}}, + + {"System.Threading", "Thread", ".ctor", System_Threading_Thread_ctor, TYPE_SYSTEM_VOID, 1, {TYPE_SYSTEM_THREADING_THREADSTART}}, + {NULL, NULL, ".ctor", System_Threading_Thread_ctorParam, TYPE_SYSTEM_VOID, 1, {TYPE_SYSTEM_THREADING_PARAMETERIZEDTHREADSTART}}, + {NULL, NULL, "Start", System_Threading_Thread_Start, TYPE_SYSTEM_VOID, 0}, + {NULL, NULL, "Sleep", System_Threading_Thread_Sleep, TYPE_SYSTEM_VOID, 1, {TYPE_SYSTEM_INT32}}, + {NULL, NULL, "get_CurrentThread", System_Threading_Thread_get_CurrentThread, TYPE_SYSTEM_THREADING_THREAD, 0}, + + {NULL, "Monitor", "Internal_TryEnter", System_Threading_Monitor_Internal_TryEnter, TYPE_SYSTEM_BOOLEAN, 2, {TYPE_SYSTEM_OBJECT, TYPE_SYSTEM_INT32}}, + {NULL, NULL, "Internal_Exit", System_Threading_Monitor_Internal_Exit, TYPE_SYSTEM_VOID, 1, {TYPE_SYSTEM_OBJECT}}, + + {NULL, "Interlocked", "CompareExchange", System_Threading_Interlocked_CompareExchange_Int32, TYPE_SYSTEM_INT32, 3, {TYPE_SYSTEM_INTPTR, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INT32}}, + {NULL, NULL, "Increment", System_Threading_Interlocked_Increment_Int32, TYPE_SYSTEM_INT32, 1, {TYPE_SYSTEM_INTPTR}}, + {NULL, NULL, "Decrement", System_Threading_Interlocked_Decrement_Int32, TYPE_SYSTEM_INT32, 1, {TYPE_SYSTEM_INTPTR}}, + {NULL, NULL, "Add", System_Threading_Interlocked_Add_Int32, TYPE_SYSTEM_INT32, 2, {TYPE_SYSTEM_INTPTR, TYPE_SYSTEM_INT32}}, + {NULL, NULL, "Exchange", System_Threading_Interlocked_Exchange_Int32, TYPE_SYSTEM_INT32, 2, {TYPE_SYSTEM_INTPTR, TYPE_SYSTEM_INT32}}, + + {"System.IO", "FileInternal", "Open", System_IO_FileInternal_Open, TYPE_SYSTEM_INTPTR, 5, {TYPE_SYSTEM_STRING, TYPE_SYSTEM_IO_FILEMODE, TYPE_SYSTEM_IO_FILEACCESS, TYPE_SYSTEM_IO_FILESHARE, TYPE_SYSTEM_INTPTR}}, + {NULL, NULL, "Read", System_IO_FileInternal_Read, TYPE_SYSTEM_INT32, 5, {TYPE_SYSTEM_INTPTR, TYPE_SYSTEM_ARRAY_BYTE, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INTPTR}}, + {NULL, NULL, "Close", System_IO_FileInternal_Close, TYPE_SYSTEM_VOID, 2, {TYPE_SYSTEM_INTPTR, TYPE_SYSTEM_INTPTR}}, + {NULL, NULL, "GetCurrentDirectory", System_IO_FileInternal_GetCurrentDirectory, TYPE_SYSTEM_STRING, 1, {TYPE_SYSTEM_INTPTR}}, + {NULL, NULL, "GetFileAttributes", System_IO_FileInternal_GetFileAttributes, TYPE_SYSTEM_IO_FILESYSTEMATTRIBUTES, 2, {TYPE_SYSTEM_STRING, TYPE_SYSTEM_INTPTR}}, + {NULL, NULL, "GetFileSystemEntries", System_IO_FileInternal_GetFileSystemEntries, TYPE_SYSTEM_ARRAY_STRING, 5, {TYPE_SYSTEM_STRING, TYPE_SYSTEM_STRING, TYPE_SYSTEM_IO_FILESYSTEMATTRIBUTES, TYPE_SYSTEM_IO_FILESYSTEMATTRIBUTES, TYPE_SYSTEM_INTPTR}}, + + {"System.Runtime.CompilerServices", "RuntimeHelpers", "InitializeArray", System_Runtime_CompilerServices_InitializeArray, TYPE_SYSTEM_VOID, 2, {TYPE_SYSTEM_ARRAY_NO_TYPE, TYPE_SYSTEM_RUNTIMEFIELDHANDLE}}, + + {"System.Diagnostics", "Debugger", "Break", System_Diagnostics_Debugger_Break, TYPE_SYSTEM_VOID, 0}, + + {"System.Net", "Dns", "Internal_GetHostEnt", System_Net_Dns_Internal_GetHostEnt, TYPE_SYSTEM_ARRAY_INT32, 2, {TYPE_SYSTEM_STRING, TYPE_SYSTEM_INTPTR}}, + + {"System.Net.Sockets", "Socket", "Internal_CreateSocket", System_Net_Sockets_Internal_CreateSocket, TYPE_SYSTEM_INTPTR, 4, {TYPE_SYSTEM_INT32, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INTPTR}}, + {NULL, NULL, "Internal_Bind", System_Net_Sockets_Internal_Bind, TYPE_SYSTEM_VOID, 4, {TYPE_SYSTEM_INTPTR, TYPE_SYSTEM_UINT32, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INTPTR}}, + {NULL, NULL, "Internal_Close", System_Net_Sockets_Internal_Close, TYPE_SYSTEM_VOID, 1, {TYPE_SYSTEM_INTPTR}}, + {NULL, NULL, "Internal_Listen", System_Net_Sockets_Internal_Listen, TYPE_SYSTEM_VOID, 3, {TYPE_SYSTEM_INTPTR, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INTPTR}}, + {NULL, NULL, "Internal_Accept", System_Net_Sockets_Internal_Accept, TYPE_SYSTEM_INTPTR, 2, {TYPE_SYSTEM_INTPTR, TYPE_SYSTEM_INTPTR}}, + {NULL, NULL, "Internal_Connect", System_Net_Sockets_Internal_Connect, TYPE_SYSTEM_VOID, 4, {TYPE_SYSTEM_INTPTR, TYPE_SYSTEM_UINT32, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INTPTR}}, + {NULL, NULL, "Internal_Receive", System_Net_Sockets_Internal_Receive, TYPE_SYSTEM_INT32, 6, {TYPE_SYSTEM_INTPTR, TYPE_SYSTEM_ARRAY_BYTE, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INTPTR}}, + {NULL, NULL, "Internal_Send", System_Net_Sockets_Internal_Send, TYPE_SYSTEM_INT32, 6, {TYPE_SYSTEM_INTPTR, TYPE_SYSTEM_ARRAY_BYTE, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INT32, TYPE_SYSTEM_INTPTR}}, + + {NULL, NULL, NULL, NULL} +}; + +fnInternalCall InternalCall_Map(tMD_MethodDef *pMethod) { + tInternalCall *pCall; + STRING curNameSpace; + STRING curType; + + if (pMethod->pParentType->pParent == types[TYPE_SYSTEM_MULTICASTDELEGATE]) { + // Special case to handle delegates + fnInternalCall fn = Map_Delegate(pMethod); + if (fn != NULL) { + return fn; + } + } else { + + for (pCall = internalCalls; pCall->method != NULL; pCall++) { + if (pCall->nameSpace != NULL) { + curNameSpace = pCall->nameSpace; + } + if (pCall->type != NULL) { + curType = pCall->type; + } + if (strcmp(pMethod->pParentType->nameSpace, curNameSpace) == 0) { + if (strcmp(pMethod->pParentType->name, curType) == 0) { + if (Type_IsMethod(pMethod, pCall->method, types[pCall->returnType], pCall->numParameters, pCall->parameterTypes)) { + return pCall->fn; + } + } + } + } + + } + Crash("InternalCall_Map(): Cannot map [%s]%s.%s", pMethod->pParentType->nameSpace, pMethod->pParentType->name, pMethod->name); + FAKE_RETURN; +} diff --git a/dna/InternalCall.h b/dna/InternalCall.h new file mode 100644 index 0000000..c56d0b3 --- /dev/null +++ b/dna/InternalCall.h @@ -0,0 +1,29 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__INTERNALCALL_H) +#define __INTERNALCALL_H + +#include "Types.h" +#include "MetaData.h" + +fnInternalCall InternalCall_Map(tMD_MethodDef *pMethod); + +#endif \ No newline at end of file diff --git a/dna/JIT.c b/dna/JIT.c new file mode 100644 index 0000000..14b78ec --- /dev/null +++ b/dna/JIT.c @@ -0,0 +1,1779 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "JIT.h" + +#include "JIT_OpCodes.h" +#include "CIL_OpCodes.h" + +#include "MetaData.h" +#include "Types.h" +#include "Type.h" +#include "InternalCall.h" +#include "Heap.h" +#include "PInvoke.h" + +#define CorILMethod_TinyFormat 0x02 +#define CorILMethod_MoreSects 0x08 + +#define CorILMethod_Sect_EHTable 0x01 +#define CorILMethod_Sect_FatFormat 0x40 +#define CorILMethod_Sect_MoreSects 0x80 + +#define DYNAMIC_OK 0x100 +#define DYNAMIC_JUMP_TARGET 0x200 +#define DYNAMIC_EX_START 0x400 +#define DYNAMIC_EX_END 0x800 +#define DYNAMIC_BYTE_COUNT_MASK 0xff + +typedef struct tOps_ tOps; +struct tOps_ { + U32 *p; + U32 capacity; + U32 ofs; +}; + +typedef struct tTypeStack_ tTypeStack; +struct tTypeStack_ { + tMD_TypeDef **ppTypes; + U32 ofs; + U32 maxBytes; // The max size of the stack in bytes +}; + +#define InitOps(ops_, initialCapacity) ops_.capacity = initialCapacity; ops_.ofs = 0; ops_.p = malloc((initialCapacity) * sizeof(I32)); +#define DeleteOps(ops_) free(ops_.p) + +// Turn this into a MACRO at some point? +static U32 Translate(U32 op, U32 getDynamic) { + if (op >= JIT_OPCODE_MAXNUM) { + Crash("Illegal opcode: %d", op); + } + if (jitCodeInfo[op].pEnd == NULL) { + Crash("Opcode not available: 0x%08x", op); + } + if (getDynamic) { + return (U32)jitCodeInfo[op].isDynamic; + } else { + return (U32)jitCodeInfo[op].pStart; + } +} + +#ifdef GEN_COMBINED_OPCODES +#define PushU32(v) PushU32_(&ops, (U32)(v)); PushU32_(&isDynamic, 0) +#define PushI32(v) PushU32_(&ops, (U32)(v)); PushU32_(&isDynamic, 0) +#define PushFloat(v) convFloat.f=(float)(v); PushU32_(&ops, convFloat.u32); PushU32_(&isDynamic, 0) +#define PushDouble(v) convDouble.d=(double)(v); PushU32_(&ops, convDouble.u32.a); PushU32_(&ops, convDouble.u32.b); PushU32_(&isDynamic, 0); PushU32_(&isDynamic, 0) +#define PushPTR(ptr) PushU32_(&ops, (U32)(ptr)); PushU32_(&isDynamic, 0) +#define PushOp(op) PushU32_(&ops, Translate((U32)(op), 0)); PushU32_(&isDynamic, Translate((U32)(op), 1)) +#define PushOpParam(op, param) PushOp(op); PushU32_(&ops, (U32)(param)); PushU32_(&isDynamic, 0) +#else +#define PushU32(v) PushU32_(&ops, (U32)(v)) +#define PushI32(v) PushU32_(&ops, (U32)(v)) +#define PushFloat(v) convFloat.f=(float)(v); PushU32_(&ops, convFloat.u32) +#define PushDouble(v) convDouble.d=(double)(v); PushU32_(&ops, convDouble.u32.a); PushU32_(&ops, convDouble.u32.b) +#define PushPTR(ptr) PushU32_(&ops, (U32)(ptr)) +#define PushOp(op) PushU32_(&ops, Translate((U32)(op), 0)) +#define PushOpParam(op, param) PushOp(op); PushU32_(&ops, (U32)(param)) +#endif + +#define PushBranch() PushU32_(&branchOffsets, ops.ofs) + +#define PushStackType(type) PushStackType_(&typeStack, type); +#define PopStackType() (typeStack.ppTypes[--typeStack.ofs]) +#define PopStackTypeDontCare() typeStack.ofs-- +#define PopStackTypeMulti(number) typeStack.ofs -= number +#define PopStackTypeAll() typeStack.ofs = 0; + +#define MayCopyTypeStack() if (u32Value > cilOfs) ppTypeStacks[u32Value] = DeepCopyTypeStack(&typeStack) + +static void PushStackType_(tTypeStack *pTypeStack, tMD_TypeDef *pType) { + U32 i, size; + + MetaData_Fill_TypeDef(pType, NULL, NULL); + pTypeStack->ppTypes[pTypeStack->ofs++] = pType; + // Count current stack size in bytes + size = 0; + for (i=0; iofs; i++) { + size += pTypeStack->ppTypes[i]->stackSize; + } + if (size > pTypeStack->maxBytes) { + pTypeStack->maxBytes = size; + } + //printf("Stack ofs = %d; Max stack size: %d (0x%x)\n", pTypeStack->ofs, size, size); +} + +static void PushU32_(tOps *pOps, U32 v) { + if (pOps->ofs >= pOps->capacity) { + pOps->capacity <<= 1; +// printf("a.pOps->p = 0x%08x size=%d\n", pOps->p, pOps->capacity * sizeof(U32)); + pOps->p = realloc(pOps->p, pOps->capacity * sizeof(U32)); + } + pOps->p[pOps->ofs++] = v; +} + +static U32 GetUnalignedU32(U8 *pCIL, U32 *pCILOfs) { + U32 a,b,c,d; + a = pCIL[(*pCILOfs)++]; + b = pCIL[(*pCILOfs)++]; + c = pCIL[(*pCILOfs)++]; + d = pCIL[(*pCILOfs)++]; + return a | (b << 8) | (c << 16) | (d << 24); +} + +static tTypeStack* DeepCopyTypeStack(tTypeStack *pToCopy) { + tTypeStack *pCopy; + + pCopy = TMALLOC(tTypeStack); + pCopy->maxBytes = pToCopy->maxBytes; + pCopy->ofs = pToCopy->ofs; + if (pToCopy->ofs > 0) { + pCopy->ppTypes = malloc(pToCopy->ofs * sizeof(tMD_TypeDef*)); + memcpy(pCopy->ppTypes, pToCopy->ppTypes, pToCopy->ofs * sizeof(tMD_TypeDef*)); + } else { + pCopy->ppTypes = NULL; + } + return pCopy; +} + +static void RestoreTypeStack(tTypeStack *pMainStack, tTypeStack *pCopyFrom) { + // This does not effect maxBytes, as the current value will always be equal + // or greater than the value being copied from. + if (pCopyFrom == NULL) { + pMainStack->ofs = 0; + } else { + pMainStack->ofs = pCopyFrom->ofs; + if (pCopyFrom->ppTypes != NULL) { + memcpy(pMainStack->ppTypes, pCopyFrom->ppTypes, pCopyFrom->ofs * sizeof(tMD_TypeDef*)); + } + } +} + +#ifdef GEN_COMBINED_OPCODES +static U32 FindOpCode(void *pAddr) { + U32 i; + for (i=0; ip[startOfs + ofs]); + U32 size = (U32)((char*)jitCodeInfo[opcode].pEnd - (char*)jitCodeInfo[opcode].pStart); + memSize += size; + ofs += (pIsDynamic->p[startOfs + ofs] & DYNAMIC_BYTE_COUNT_MASK) >> 2; + } + // Add length of GoNext code + memSize += goNextSize; + + pCombined = malloc(memSize); + *ppMem = pCombined; + combinedMemSize += memSize; + *pCombinedSize = memSize; + //log_f(0, "Combined JIT size: %d\n", combinedMemSize); + + // Copy the bits of code into place + memSize = 0; + opCopyToOfs = 1; + for (ofs=0; ofs < count; ofs++) { + U32 extraOpBytes; + U32 opcode = FindOpCode((void*)pOps->p[startOfs + ofs]); + U32 size = (U32)((char*)jitCodeInfo[opcode].pEnd - (char*)jitCodeInfo[opcode].pStart); + memcpy((char*)pCombined + memSize, jitCodeInfo[opcode].pStart, size); + memSize += size; + extraOpBytes = pIsDynamic->p[startOfs + ofs] & DYNAMIC_BYTE_COUNT_MASK; + memmove(&pOps->p[startOfs + opCopyToOfs], &pOps->p[startOfs + ofs + 1], extraOpBytes); + opCopyToOfs += extraOpBytes >> 2; + ofs += extraOpBytes >> 2; + } + shrinkOpsBy = ofs - opCopyToOfs; + // Add GoNext code + memcpy((char*)pCombined + memSize, jitCodeGoNext.pStart, goNextSize); + pOps->p[startOfs] = (U32)pCombined; + + return shrinkOpsBy; +} +#endif + +static U32* JITit(tMD_MethodDef *pMethodDef, U8 *pCIL, U32 codeSize, tParameter *pLocals, tJITted *pJITted, U32 genCombinedOpcodes) { + U32 maxStack = pJITted->maxStack; + U32 i; + U32 cilOfs; + tOps ops; // The JITted op-codes + tOps branchOffsets; // Filled with all the branch instructions that need offsets fixing + U32 *pJITOffsets; // To store the JITted code offset of each CIL byte. + // Only CIL bytes that are the first byte of an instruction will have meaningful data + tTypeStack **ppTypeStacks; // To store the evaluation stack state for forward jumps + U32 *pFinalOps; + tMD_TypeDef *pStackType; + tTypeStack typeStack; + +#ifdef GEN_COMBINED_OPCODES + tOps isDynamic; +#endif + + I32 i32Value; + U32 u32Value, u32Value2, ofs; + uConvFloat convFloat; + uConvDouble convDouble; + tMD_TypeDef *pTypeA, *pTypeB; + PTR pMem; + tMetaData *pMetaData; + + pMetaData = pMethodDef->pMetaData; + pJITOffsets = malloc(codeSize * sizeof(U32)); + // + 1 to handle cases where the stack is being restored at the last instruction in a method + ppTypeStacks = malloc((codeSize + 1) * sizeof(tTypeStack*)); + memset(ppTypeStacks, 0, (codeSize + 1) * sizeof(tTypeStack*)); + typeStack.maxBytes = 0; + typeStack.ofs = 0; + typeStack.ppTypes = malloc(maxStack * sizeof(tMD_TypeDef*)); + + // Set up all exception 'catch' blocks with the correct stack information, + // So they'll have just the exception type on the stack when entered + for (i=0; inumExceptionHandlers; i++) { + tExceptionHeader *pEx; + + pEx = &pJITted->pExceptionHeaders[i]; + if (pEx->flags == COR_ILEXCEPTION_CLAUSE_EXCEPTION) { + tTypeStack *pTypeStack; + + ppTypeStacks[pEx->handlerStart] = pTypeStack = TMALLOC(tTypeStack); + pTypeStack->maxBytes = 4; + pTypeStack->ofs = 1; + pTypeStack->ppTypes = TMALLOC(tMD_TypeDef*); + pTypeStack->ppTypes[0] = pEx->u.pCatchTypeDef; + } + } + + InitOps(ops, 32); + InitOps(branchOffsets, 16); +#ifdef GEN_COMBINED_OPCODES + InitOps(isDynamic, 32); +#endif + + cilOfs = 0; + + do { + U8 op; + + // Set the JIT offset for this CIL opcode + pJITOffsets[cilOfs] = ops.ofs; + + op = pCIL[cilOfs++]; + //printf("Opcode: 0x%02x\n", op); + + switch (op) { + case CIL_NOP: + PushOp(JIT_NOP); + break; + + case CIL_LDNULL: + PushOp(JIT_LOAD_NULL); + PushStackType(types[TYPE_SYSTEM_OBJECT]); + break; + + case CIL_DUP: + pStackType = PopStackType(); + PushStackType(pStackType); + PushStackType(pStackType); + switch (pStackType->stackSize) { + case 4: + PushOp(JIT_DUP_4); + break; + case 8: + PushOp(JIT_DUP_8); + break; + default: + PushOpParam(JIT_DUP_GENERAL, pStackType->stackSize); + break; + } + break; + + case CIL_POP: + pStackType = PopStackType(); + if (pStackType->stackSize == 4) { + PushOp(JIT_POP_4); + } else { + PushOpParam(JIT_POP, pStackType->stackSize); + } + break; + + case CIL_LDC_I4_M1: + case CIL_LDC_I4_0: + case CIL_LDC_I4_1: + case CIL_LDC_I4_2: + case CIL_LDC_I4_3: + case CIL_LDC_I4_4: + case CIL_LDC_I4_5: + case CIL_LDC_I4_6: + case CIL_LDC_I4_7: + case CIL_LDC_I4_8: + i32Value = (I8)op - (I8)CIL_LDC_I4_0; + goto cilLdcI4; + + case CIL_LDC_I4_S: + i32Value = (I8)pCIL[cilOfs++]; + goto cilLdcI4; + + case CIL_LDC_I4: + i32Value = (I32)GetUnalignedU32(pCIL, &cilOfs); +cilLdcI4: + if (i32Value >= -1 && i32Value <= 2) { + PushOp(JIT_LOAD_I4_0 + i32Value); + } else { + PushOp(JIT_LOAD_I32); + PushI32(i32Value); + } + PushStackType(types[TYPE_SYSTEM_INT32]); + break; + + case CIL_LDC_I8: + PushOp(JIT_LOAD_I64); + u32Value = GetUnalignedU32(pCIL, &cilOfs); + PushU32(u32Value); + u32Value = GetUnalignedU32(pCIL, &cilOfs); + PushU32(u32Value); + PushStackType(types[TYPE_SYSTEM_INT64]); + break; + + case CIL_LDC_R4: + convFloat.u32 = GetUnalignedU32(pCIL, &cilOfs); + PushStackType(types[TYPE_SYSTEM_SINGLE]); + PushOp(JIT_LOAD_F32); + PushFloat(convFloat.f); + break; + + case CIL_LDC_R8: + convDouble.u32.a = GetUnalignedU32(pCIL, &cilOfs); + convDouble.u32.b = GetUnalignedU32(pCIL, &cilOfs); + PushStackType(types[TYPE_SYSTEM_DOUBLE]); + PushOp(JIT_LOAD_F64); + PushDouble(convDouble.d); + break; + + case CIL_LDARG_0: + case CIL_LDARG_1: + case CIL_LDARG_2: + case CIL_LDARG_3: + u32Value = op - CIL_LDARG_0; + goto cilLdArg; + + case CIL_LDARG_S: + u32Value = pCIL[cilOfs++]; +cilLdArg: + pStackType = pMethodDef->pParams[u32Value].pTypeDef; + ofs = pMethodDef->pParams[u32Value].offset; + if (pStackType->stackSize == 4 && ofs < 32) { + PushOp(JIT_LOADPARAMLOCAL_0 + (ofs >> 2)); + } else { + PushOpParam(JIT_LOADPARAMLOCAL_TYPEID + pStackType->stackType, ofs); + // if it's a valuetype then push the TypeDef of it afterwards + if (pStackType->stackType == EVALSTACK_VALUETYPE) { + PushPTR(pStackType); + } + } + PushStackType(pStackType); + break; + + case CIL_LDARGA_S: + // Get the argument number to load the address of + u32Value = pCIL[cilOfs++]; + PushOpParam(JIT_LOAD_PARAMLOCAL_ADDR, pMethodDef->pParams[u32Value].offset); + PushStackType(types[TYPE_SYSTEM_INTPTR]); + break; + + case CIL_STARG_S: + // Get the argument number to store the arg of + u32Value = pCIL[cilOfs++]; + pStackType = PopStackType(); + ofs = pMethodDef->pParams[u32Value].offset; + if (pStackType->stackSize == 4 && ofs < 32) { + PushOp(JIT_STOREPARAMLOCAL_0 + (ofs >> 2)); + } else { + PushOpParam(JIT_STOREPARAMLOCAL_TYPEID + pStackType->stackType, ofs); + // if it's a valuetype then push the TypeDef of it afterwards + if (pStackType->stackType == EVALSTACK_VALUETYPE) { + PushPTR(pStackType); + } + } + break; + + case CIL_LDLOC_0: + case CIL_LDLOC_1: + case CIL_LDLOC_2: + case CIL_LDLOC_3: + // Push opcode and offset into locals memory + u32Value = op - CIL_LDLOC_0; + goto cilLdLoc; + + case CIL_LDLOC_S: + // Push opcode and offset into locals memory + u32Value = pCIL[cilOfs++]; +cilLdLoc: + pStackType = pLocals[u32Value].pTypeDef; + ofs = pMethodDef->parameterStackSize + pLocals[u32Value].offset; + if (pStackType->stackSize == 4 && ofs < 32) { + PushOp(JIT_LOADPARAMLOCAL_0 + (ofs >> 2)); + } else { + PushOpParam(JIT_LOADPARAMLOCAL_TYPEID + pStackType->stackType, ofs); + // if it's a valuetype then push the TypeDef of it afterwards + if (pStackType->stackType == EVALSTACK_VALUETYPE) { + PushPTR(pStackType); + } + } + PushStackType(pStackType); + break; + + case CIL_STLOC_0: + case CIL_STLOC_1: + case CIL_STLOC_2: + case CIL_STLOC_3: + u32Value = op - CIL_STLOC_0; + goto cilStLoc; + + case CIL_STLOC_S: + u32Value = pCIL[cilOfs++]; +cilStLoc: + pStackType = PopStackType(); + ofs = pMethodDef->parameterStackSize + pLocals[u32Value].offset; + if (pStackType->stackSize == 4 && ofs < 32) { + PushOp(JIT_STOREPARAMLOCAL_0 + (ofs >> 2)); + } else { + PushOpParam(JIT_STOREPARAMLOCAL_TYPEID + pStackType->stackType, ofs); + // if it's a valuetype then push the TypeDef of it afterwards + if (pStackType->stackType == EVALSTACK_VALUETYPE) { + PushPTR(pStackType); + } + } + break; + + case CIL_LDLOCA_S: + // Get the local number to load the address of + u32Value = pCIL[cilOfs++]; + PushOpParam(JIT_LOAD_PARAMLOCAL_ADDR, pMethodDef->parameterStackSize + pLocals[u32Value].offset); + PushStackType(types[TYPE_SYSTEM_INTPTR]); + break; + + case CIL_LDIND_I1: + u32Value = TYPE_SYSTEM_SBYTE; + goto cilLdInd; + case CIL_LDIND_U1: + u32Value = TYPE_SYSTEM_BYTE; + goto cilLdInd; + case CIL_LDIND_I2: + u32Value = TYPE_SYSTEM_INT16; + goto cilLdInd; + case CIL_LDIND_U2: + u32Value = TYPE_SYSTEM_UINT16; + goto cilLdInd; + case CIL_LDIND_I4: + u32Value = TYPE_SYSTEM_INT32; + goto cilLdInd; + case CIL_LDIND_U4: + u32Value = TYPE_SYSTEM_UINT32; + goto cilLdInd; + case CIL_LDIND_I8: + u32Value = TYPE_SYSTEM_INT64; + goto cilLdInd; + case CIL_LDIND_R4: + u32Value = TYPE_SYSTEM_SINGLE; + goto cilLdInd; + case CIL_LDIND_R8: + u32Value = TYPE_SYSTEM_DOUBLE; + goto cilLdInd; + case CIL_LDIND_REF: + u32Value = TYPE_SYSTEM_OBJECT; + goto cilLdInd; + case CIL_LDIND_I: + u32Value = TYPE_SYSTEM_INTPTR; +cilLdInd: + PopStackTypeDontCare(); // don't care what it is + PushOp(JIT_LOADINDIRECT_I8 + (op - CIL_LDIND_I1)); + PushStackType(types[u32Value]); + break; + + case CIL_STIND_REF: + case CIL_STIND_I1: + case CIL_STIND_I2: + case CIL_STIND_I4: + PopStackTypeMulti(2); // Don't care what they are + PushOp(JIT_STOREINDIRECT_REF + (op - CIL_STIND_REF)); + break; + + case CIL_RET: + PushOp(JIT_RETURN); + RestoreTypeStack(&typeStack, ppTypeStacks[cilOfs]); + break; + + case CIL_CALL: + case CIL_CALLVIRT: + { + tMD_MethodDef *pCallMethod; + tMD_TypeDef *pBoxCallType; + U32 derefRefType; + + u32Value2 = 0; + +cilCallVirtConstrained: + pBoxCallType = NULL; + derefRefType = 0; + + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pCallMethod = MetaData_GetMethodDefFromDefRefOrSpec(pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + if (pCallMethod->isFilled == 0) { + tMD_TypeDef *pTypeDef; + + pTypeDef = MetaData_GetTypeDefFromMethodDef(pCallMethod); + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + } + + if (u32Value2 != 0) { + // There is a 'constrained' prefix + tMD_TypeDef *pConstrainedType; + + pConstrainedType = MetaData_GetTypeDefFromDefRefOrSpec(pMetaData, u32Value2, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + if (TYPE_ISINTERFACE(pCallMethod->pParentType)) { + u32Value2 = 0xffffffff; + // Find the interface that we're dealing with + for (i=0; inumInterfaces; i++) { + if (pConstrainedType->pInterfaceMaps[i].pInterface == pCallMethod->pParentType) { + u32Value2 = pConstrainedType->pInterfaceMaps[i].pVTableLookup[pCallMethod->vTableOfs]; + break; + } + } + Assert(u32Value2 != 0xffffffff); + if (pConstrainedType->pVTable[u32Value2]->pParentType == pConstrainedType) { + // This method is implemented on this class, so make it a normal CALL op + op = CIL_CALL; + pCallMethod = pConstrainedType->pVTable[u32Value2]; + } + } else { + if (pConstrainedType->isValueType) { + tMD_MethodDef *pImplMethod; + // If pConstraintedType directly implements the call then don't do anything + // otherwise the 'this' pointer must be boxed (BoxedCall) + pImplMethod = pConstrainedType->pVTable[pCallMethod->vTableOfs]; + if (pImplMethod->pParentType == pConstrainedType) { + op = CIL_CALL; + pCallMethod = pImplMethod; + } else { + pBoxCallType = pConstrainedType; + } + } else { + // Reference-type, so dereference the PTR to 'this' and use that for the 'this' for the call. + derefRefType = 1; + } + } + } + + // Pop stack type for each argument. Don't actually care what these are, + // except the last one which will be the 'this' object type of a non-static method + //printf("Call %s() - popping %d stack args\n", pCallMethod->name, pCallMethod->numberOfParameters); + for (i=0; inumberOfParameters; i++) { + pStackType = PopStackType(); + } + // the stack type of the 'this' object will now be in stackType (if there is one) + if (METHOD_ISSTATIC(pCallMethod)) { + pStackType = types[TYPE_SYSTEM_OBJECT]; + } + MetaData_Fill_TypeDef(pStackType, NULL, NULL); + if (TYPE_ISINTERFACE(pCallMethod->pParentType) && op == CIL_CALLVIRT) { + PushOp(JIT_CALL_INTERFACE); + } else if (pCallMethod->pParentType->pParent == types[TYPE_SYSTEM_MULTICASTDELEGATE]) { + PushOp(JIT_INVOKE_DELEGATE); + } else { + switch (pStackType->stackType) + { + case EVALSTACK_INTNATIVE: // Not really right, but it'll work on 32-bit + case EVALSTACK_O: + if (derefRefType) { + PushOp(JIT_DEREF_CALLVIRT); + } else { + if (pBoxCallType != NULL) { + PushOp(JIT_BOX_CALLVIRT); + PushPTR(pBoxCallType); + } else { + PushOp((op == CIL_CALL)?JIT_CALL_O:JIT_CALLVIRT_O); + } + } + break; + case EVALSTACK_PTR: + case EVALSTACK_VALUETYPE: + if (derefRefType) { + PushOp(JIT_DEREF_CALLVIRT); + } else if (pBoxCallType != NULL) { + PushOp(JIT_BOX_CALLVIRT); + PushPTR(pBoxCallType); + } else { + PushOp(JIT_CALL_PTR); + } + break; + default: + Crash("JITit(): Cannot CALL or CALLVIRT with stack type: %d", pStackType->stackType); + } + } + PushPTR(pCallMethod); + + if (pCallMethod->pReturnType != NULL) { + PushStackType(pCallMethod->pReturnType); + } + } + break; + + case CIL_BR_S: // unconditional branch + u32Value = (I8)pCIL[cilOfs++]; + goto cilBr; + + case CIL_BR: + u32Value = GetUnalignedU32(pCIL, &cilOfs); +cilBr: + // Put a temporary CIL offset value into the JITted code. This will be updated later + u32Value = cilOfs + (I32)u32Value; + MayCopyTypeStack(); + PushOp(JIT_BRANCH); + PushBranch(); + PushU32(u32Value); + // Restore the stack state + RestoreTypeStack(&typeStack, ppTypeStacks[cilOfs]); + break; + + case CIL_SWITCH: + // This is the int containing the switch value. Don't care what it is. + PopStackTypeDontCare(); + // The number of switch jump targets + i32Value = (I32)GetUnalignedU32(pCIL, &cilOfs); + // Set up the offset from which the jump offsets are calculated + u32Value2 = cilOfs + (i32Value << 2); + PushOpParam(JIT_SWITCH, i32Value); + for (i=0; i<(U32)i32Value; i++) { + // A jump target + u32Value = u32Value2 + (I32)GetUnalignedU32(pCIL, &cilOfs); + PushBranch(); + MayCopyTypeStack(); + // Push the jump target. + // It is needed to allow the branch offset to be correctly updated later. + PushU32(u32Value); + } + break; + + case CIL_BRFALSE_S: + case CIL_BRTRUE_S: + u32Value = (I8)pCIL[cilOfs++]; + u32Value2 = JIT_BRANCH_FALSE + (op - CIL_BRFALSE_S); + goto cilBrFalseTrue; + + case CIL_BRFALSE: + case CIL_BRTRUE: + u32Value = GetUnalignedU32(pCIL, &cilOfs); + u32Value2 = JIT_BRANCH_FALSE + (op - CIL_BRFALSE); +cilBrFalseTrue: + PopStackTypeDontCare(); // Don't care what it is + // Put a temporary CIL offset value into the JITted code. This will be updated later + u32Value = cilOfs + (I32)u32Value; + MayCopyTypeStack(); + PushOp(u32Value2); + PushBranch(); + PushU32(u32Value); + break; + + case CIL_BEQ_S: + case CIL_BGE_S: + case CIL_BGT_S: + case CIL_BLE_S: + case CIL_BLT_S: + case CIL_BNE_UN_S: + case CIL_BGE_UN_S: + case CIL_BGT_UN_S: + case CIL_BLE_UN_S: + case CIL_BLT_UN_S: + u32Value = (I8)pCIL[cilOfs++]; + u32Value2 = CIL_BEQ_S; + goto cilBrCond; + + case CIL_BEQ: + case CIL_BGE: + case CIL_BGT: + case CIL_BLE: + case CIL_BLT: + case CIL_BNE_UN: + case CIL_BGE_UN: + case CIL_BGT_UN: + case CIL_BLE_UN: + case CIL_BLT_UN: + u32Value = GetUnalignedU32(pCIL, &cilOfs); + u32Value2 = CIL_BEQ; +cilBrCond: + pTypeB = PopStackType(); + pTypeA = PopStackType(); + u32Value = cilOfs + (I32)u32Value; + MayCopyTypeStack(); + if ((pTypeA->stackType == EVALSTACK_INT32 && pTypeB->stackType == EVALSTACK_INT32) || + (pTypeA->stackType == EVALSTACK_O && pTypeB->stackType == EVALSTACK_O)) { + PushOp(JIT_BEQ_I32I32 + (op - u32Value2)); + } else if (pTypeA->stackType == EVALSTACK_INT64 && pTypeB->stackType == EVALSTACK_INT64) { + PushOp(JIT_BEQ_I64I64 + (op - u32Value2)); + } else if (pTypeA->stackType == EVALSTACK_F32 && pTypeB->stackType == EVALSTACK_F32) { + PushOp(JIT_BEQ_F32F32 + (op - u32Value2)); + } else if (pTypeA->stackType == EVALSTACK_F64 && pTypeB->stackType == EVALSTACK_F64) { + PushOp(JIT_BEQ_F64F64 + (op - u32Value2)); + } else { + Crash("JITit(): Cannot perform conditional branch on stack types: %d and %d", pTypeA->stackType, pTypeB->stackType); + } + PushBranch(); + PushU32(u32Value); + break; + + case CIL_ADD_OVF: + case CIL_ADD_OVF_UN: + case CIL_MUL_OVF: + case CIL_MUL_OVF_UN: + case CIL_SUB_OVF: + case CIL_SUB_OVF_UN: + u32Value = (CIL_ADD_OVF - CIL_ADD) + (JIT_ADD_I32I32 - JIT_ADD_OVF_I32I32); + goto cilBinaryArithOp; + case CIL_ADD: + case CIL_SUB: + case CIL_MUL: + case CIL_DIV: + case CIL_DIV_UN: + case CIL_REM: + case CIL_REM_UN: + case CIL_AND: + case CIL_OR: + case CIL_XOR: + u32Value = 0; +cilBinaryArithOp: + pTypeB = PopStackType(); + pTypeA = PopStackType(); + if (pTypeA->stackType == EVALSTACK_INT32 && pTypeB->stackType == EVALSTACK_INT32) { + PushOp(JIT_ADD_I32I32 + (op - CIL_ADD) - u32Value); + PushStackType(types[TYPE_SYSTEM_INT32]); + } else if (pTypeA->stackType == EVALSTACK_INT64 && pTypeB->stackType == EVALSTACK_INT64) { + PushOp(JIT_ADD_I64I64 + (op - CIL_ADD) - u32Value); + PushStackType(types[TYPE_SYSTEM_INT64]); + } else if (pTypeA->stackType == EVALSTACK_F32 && pTypeB->stackType == EVALSTACK_F32) { + PushOp(JIT_ADD_F32F32 + (op - CIL_ADD) - u32Value); + PushStackType(pTypeA); + } else if (pTypeA->stackType == EVALSTACK_F64 && pTypeB->stackType == EVALSTACK_F64) { + PushOp(JIT_ADD_F64F64 + (op - CIL_ADD) - u32Value); + PushStackType(pTypeA); + } else { + Crash("JITit(): Cannot perform binary numeric operand on stack types: %d and %d", pTypeA->stackType, pTypeB->stackType); + } + break; + + case CIL_NEG: + case CIL_NOT: + pTypeA = PopStackType(); + if (pTypeA->stackType == EVALSTACK_INT32) { + PushOp(JIT_NEG_I32 + (op - CIL_NEG)); + PushStackType(types[TYPE_SYSTEM_INT32]); + } else if (pTypeA->stackType == EVALSTACK_INT64) { + PushOp(JIT_NEG_I64 + (op - CIL_NEG)); + PushStackType(types[TYPE_SYSTEM_INT64]); + } else { + Crash("JITit(): Cannot perform unary operand on stack types: %d", pTypeA->stackType); + } + break; + + case CIL_SHL: + case CIL_SHR: + case CIL_SHR_UN: + PopStackTypeDontCare(); // Don't care about the shift amount + pTypeA = PopStackType(); // Do care about the value to shift + if (pTypeA->stackType == EVALSTACK_INT32) { + PushOp(JIT_SHL_I32 - CIL_SHL + op); + PushStackType(types[TYPE_SYSTEM_INT32]); + } else if (pTypeA->stackType == EVALSTACK_INT64) { + PushOp(JIT_SHL_I64 - CIL_SHL + op); + PushStackType(types[TYPE_SYSTEM_INT64]); + } else { + Crash("JITit(): Cannot perform shift operation on type: %s", pTypeA->name); + } + break; + + // Conversion operations + { + U32 toType; + U32 toBitCount; + U32 convOpOffset; + case CIL_CONV_I1: + case CIL_CONV_OVF_I1: // Fix this later - will never overflow + case CIL_CONV_OVF_I1_UN: // Fix this later - will never overflow + toBitCount = 8; + toType = TYPE_SYSTEM_SBYTE; + goto cilConvInt32; + case CIL_CONV_I2: + case CIL_CONV_OVF_I2: // Fix this later - will never overflow + case CIL_CONV_OVF_I2_UN: // Fix this later - will never overflow + toBitCount = 16; + toType = TYPE_SYSTEM_INT16; + goto cilConvInt32; + case CIL_CONV_I4: + case CIL_CONV_OVF_I4: // Fix this later - will never overflow + case CIL_CONV_OVF_I4_UN: // Fix this later - will never overflow + case CIL_CONV_I: // Only on 32-bit + case CIL_CONV_OVF_I_UN: // Only on 32-bit; Fix this later - will never overflow + toBitCount = 32; + toType = TYPE_SYSTEM_INT32; +cilConvInt32: + convOpOffset = JIT_CONV_OFFSET_I32; + goto cilConv; + case CIL_CONV_U1: + case CIL_CONV_OVF_U1: // Fix this later - will never overflow + case CIL_CONV_OVF_U1_UN: // Fix this later - will never overflow + toBitCount = 8; + toType = TYPE_SYSTEM_BYTE; + goto cilConvUInt32; + case CIL_CONV_U2: + case CIL_CONV_OVF_U2: // Fix this later - will never overflow + case CIL_CONV_OVF_U2_UN: // Fix this later - will never overflow + toBitCount = 16; + toType = TYPE_SYSTEM_UINT16; + goto cilConvUInt32; + case CIL_CONV_U4: + case CIL_CONV_OVF_U4: // Fix this later - will never overflow + case CIL_CONV_OVF_U4_UN: // Fix this later - will never overflow + case CIL_CONV_U: // Only on 32-bit + case CIL_CONV_OVF_U_UN: // Only on 32-bit; Fix this later - will never overflow + toBitCount = 32; + toType = TYPE_SYSTEM_UINT32; +cilConvUInt32: + convOpOffset = JIT_CONV_OFFSET_U32; + goto cilConv; + case CIL_CONV_I8: + case CIL_CONV_OVF_I8: // Fix this later - will never overflow + case CIL_CONV_OVF_I8_UN: // Fix this later - will never overflow + toType = TYPE_SYSTEM_INT64; + convOpOffset = JIT_CONV_OFFSET_I64; + goto cilConv; + case CIL_CONV_U8: + case CIL_CONV_OVF_U8: // Fix this later - will never overflow + case CIL_CONV_OVF_U8_UN: // Fix this later - will never overflow + toType = TYPE_SYSTEM_UINT64; + convOpOffset = JIT_CONV_OFFSET_U64; + goto cilConv; + case CIL_CONV_R4: + toType = TYPE_SYSTEM_SINGLE; + convOpOffset = JIT_CONV_OFFSET_R32; + goto cilConv; + case CIL_CONV_R8: + case CIL_CONV_R_UN: + toType = TYPE_SYSTEM_DOUBLE; + convOpOffset = JIT_CONV_OFFSET_R64; + goto cilConv; +cilConv: + pStackType = PopStackType(); + { + U32 opCodeBase; + U32 useParam = 0, param; + // This is the types that the conversion is from. + switch (pStackType->stackType) { + case EVALSTACK_INT64: + opCodeBase = (pStackType == types[TYPE_SYSTEM_INT64])?JIT_CONV_FROM_I64:JIT_CONV_FROM_U64; + break; + case EVALSTACK_INT32: + case EVALSTACK_PTR: // Only on 32-bit + opCodeBase = + (pStackType == types[TYPE_SYSTEM_BYTE] || + pStackType == types[TYPE_SYSTEM_UINT16] || + pStackType == types[TYPE_SYSTEM_UINT32] || + pStackType == types[TYPE_SYSTEM_UINTPTR])?JIT_CONV_FROM_U32:JIT_CONV_FROM_I32; + break; + case EVALSTACK_F64: + opCodeBase = JIT_CONV_FROM_R64; + break; + case EVALSTACK_F32: + opCodeBase = JIT_CONV_FROM_R32; + break; + default: + Crash("JITit() Conv cannot handle stack type %d", pStackType->stackType); + } + // This is the types that the conversion is to. + switch (convOpOffset) { + case JIT_CONV_OFFSET_I32: + useParam = 1; + param = 32 - toBitCount; + break; + case JIT_CONV_OFFSET_U32: + useParam = 1; + // Next line is really (1 << toBitCount) - 1 + // But it's done like this to work when toBitCount == 32 + param = (((1 << (toBitCount - 1)) - 1) << 1) + 1; + break; + case JIT_CONV_OFFSET_I64: + case JIT_CONV_OFFSET_U64: + case JIT_CONV_OFFSET_R32: + case JIT_CONV_OFFSET_R64: + break; + default: + Crash("JITit() Conv cannot handle convOpOffset %d", convOpOffset); + } + PushOp(opCodeBase + convOpOffset); + if (useParam) { + PushU32(param); + } + } + PushStackType(types[toType]); + break; + } + +#ifdef OLD_CONV + case CIL_CONV_OVF_I1: + case CIL_CONV_OVF_I2: + case CIL_CONV_OVF_I4: + u32Value = TYPE_SYSTEM_INT32; + goto convOvf; + case CIL_CONV_OVF_I8: + u32Value = TYPE_SYSTEM_INT64; + goto convOvf; + case CIL_CONV_OVF_U1: + case CIL_CONV_OVF_U2: + case CIL_CONV_OVF_U4: + u32Value = TYPE_SYSTEM_UINT32; + goto convOvf; + case CIL_CONV_OVF_U8: + u32Value = TYPE_SYSTEM_UINT64; +convOvf: + pStackType = PopStackType(); + PushOpParam(JIT_CONV_OVF_I1 + (op - CIL_CONV_OVF_I1), pStackType->stackType); + PushStackType(types[u32Value]); + break; + + case CIL_CONV_I1: + case CIL_CONV_I2: + case CIL_CONV_I4: + u32Value = TYPE_SYSTEM_INT32; + goto conv1; + case CIL_CONV_I8: + u32Value = TYPE_SYSTEM_INT64; + goto conv1; + case CIL_CONV_R4: + u32Value = TYPE_SYSTEM_SINGLE; + goto conv1; + case CIL_CONV_R8: + u32Value = TYPE_SYSTEM_DOUBLE; + goto conv1; + case CIL_CONV_U4: + u32Value = TYPE_SYSTEM_UINT32; + goto conv1; + case CIL_CONV_U8: + u32Value = TYPE_SYSTEM_UINT64; +conv1: + pStackType = PopStackType(); + PushOpParam(JIT_CONV_I1 + (op - CIL_CONV_I1), pStackType->stackType); + PushStackType(types[u32Value]); + break; + + case CIL_CONV_U2: + case CIL_CONV_U1: + u32Value = TYPE_SYSTEM_UINT32; + goto conv2; + case CIL_CONV_I: + u32Value = TYPE_SYSTEM_INT32; // Only on 32-bit +conv2: + pStackType = PopStackType(); + PushOpParam(JIT_CONV_U2 + (op - CIL_CONV_U2), pStackType->stackType); + PushStackType(types[u32Value]); + break; + + case CIL_CONV_U: + pStackType = PopStackType(); + PushOpParam(JIT_CONV_U_NATIVE, pStackType->stackType); + PushStackType(types[TYPE_SYSTEM_UINTPTR]); + break; +#endif + + case CIL_LDOBJ: + { + tMD_TypeDef *pTypeDef; + + PopStackTypeDontCare(); // Don't care what this is + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pTypeDef = MetaData_GetTypeDefFromDefRefOrSpec(pMethodDef->pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + PushOp(JIT_LOADOBJECT); + PushPTR(pTypeDef); + PushStackType(pTypeDef); + } + break; + + case CIL_STOBJ: + { + tMD_TypeDef *pTypeDef; + + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pTypeDef = MetaData_GetTypeDefFromDefRefOrSpec(pMethodDef->pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + PopStackTypeMulti(2); + if (pTypeDef->isValueType && pTypeDef->arrayElementSize != 4) { + // If it's a value-type then do this + PushOpParam(JIT_STORE_OBJECT_VALUETYPE, pTypeDef->arrayElementSize); + } else { + // If it's a ref type, or a value-type with size 4, then can do this instead + // (it executes faster) + PushOp(JIT_STOREINDIRECT_REF); + } + break; + } + + case CIL_LDSTR: + u32Value = GetUnalignedU32(pCIL, &cilOfs) & 0x00ffffff; + PushOpParam(JIT_LOAD_STRING, u32Value); + PushStackType(types[TYPE_SYSTEM_STRING]); + break; + + case CIL_NEWOBJ: + { + tMD_MethodDef *pConstructorDef; + + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pConstructorDef = MetaData_GetMethodDefFromDefRefOrSpec(pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + if (pConstructorDef->isFilled == 0) { + tMD_TypeDef *pTypeDef; + + pTypeDef = MetaData_GetTypeDefFromMethodDef(pConstructorDef); + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + } + if (pConstructorDef->pParentType->isValueType) { + PushOp(JIT_NEWOBJECT_VALUETYPE); + } else { + PushOp(JIT_NEWOBJECT); + } + // -1 because the param count includes the 'this' parameter that is sent to the constructor + PopStackTypeMulti(pConstructorDef->numberOfParameters - 1); + PushPTR(pConstructorDef); + PushStackType(pConstructorDef->pParentType); + } + break; + + case CIL_CASTCLASS: + { + tMD_TypeDef *pCastToType; + + PushOp(JIT_CAST_CLASS); + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pCastToType = MetaData_GetTypeDefFromDefRefOrSpec(pMethodDef->pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + PushPTR(pCastToType); + } + break; + + case CIL_ISINST: + { + tMD_TypeDef *pIsInstanceOfType; + + PushOp(JIT_IS_INSTANCE); + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pIsInstanceOfType = MetaData_GetTypeDefFromDefRefOrSpec(pMethodDef->pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + PushPTR(pIsInstanceOfType); + } + break; + + case CIL_NEWARR: + { + tMD_TypeDef *pTypeDef; + + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pTypeDef = MetaData_GetTypeDefFromDefRefOrSpec(pMethodDef->pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + PopStackTypeDontCare(); // Don't care what it is + PushOp(JIT_NEW_VECTOR); + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + pTypeDef = Type_GetArrayTypeDef(pTypeDef, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + PushPTR(pTypeDef); + PushStackType(pTypeDef); + } + break; + + case CIL_LDLEN: + PopStackTypeDontCare(); // Don't care what it is + PushOp(JIT_LOAD_VECTOR_LEN); + PushStackType(types[TYPE_SYSTEM_INT32]); + break; + + case CIL_LDELEM_I1: + case CIL_LDELEM_U1: + case CIL_LDELEM_I2: + case CIL_LDELEM_U2: + case CIL_LDELEM_I4: + case CIL_LDELEM_U4: + PopStackTypeMulti(2); // Don't care what any of these are + PushOp(JIT_LOAD_ELEMENT_I8 + (op - CIL_LDELEM_I1)); + PushStackType(types[TYPE_SYSTEM_INT32]); + break; + + case CIL_LDELEM_I8: + PopStackTypeMulti(2); // Don't care what any of these are + PushOp(JIT_LOAD_ELEMENT_I64); + PushStackType(types[TYPE_SYSTEM_INT64]); + break; + + case CIL_LDELEM_R4: + PopStackTypeMulti(2); // Don't care what any of these are + PushOp(JIT_LOAD_ELEMENT_R32); + PushStackType(types[TYPE_SYSTEM_SINGLE]); + break; + + case CIL_LDELEM_R8: + PopStackTypeMulti(2); // Don't care what any of these are + PushOp(JIT_LOAD_ELEMENT_R64); + PushStackType(types[TYPE_SYSTEM_DOUBLE]); + break; + + case CIL_LDELEM_REF: + PopStackTypeMulti(2); // Don't care what any of these are + PushOp(JIT_LOAD_ELEMENT_U32); + PushStackType(types[TYPE_SYSTEM_OBJECT]); + break; + + case CIL_LDELEM_ANY: + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pStackType = (tMD_TypeDef*)MetaData_GetTypeDefFromDefRefOrSpec(pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + PopStackTypeMulti(2); // Don't care what these are + PushOpParam(JIT_LOAD_ELEMENT, pStackType->stackSize); + PushStackType(pStackType); + break; + + case CIL_LDELEMA: + PopStackTypeMulti(2); // Don't care what any of these are + GetUnalignedU32(pCIL, &cilOfs); // Don't care what this is + PushOp(JIT_LOAD_ELEMENT_ADDR); + PushStackType(types[TYPE_SYSTEM_INTPTR]); + break; + + case CIL_STELEM_I1: + case CIL_STELEM_I2: + case CIL_STELEM_I4: + case CIL_STELEM_R4: + case CIL_STELEM_REF: + PopStackTypeMulti(3); // Don't care what any of these are + PushOp(JIT_STORE_ELEMENT_32); + break; + + case CIL_STELEM_I8: + case CIL_STELEM_R8: + PopStackTypeMulti(3); // Don't care what any of these are + PushOp(JIT_STORE_ELEMENT_64); + break; + + case CIL_STELEM_ANY: + GetUnalignedU32(pCIL, &cilOfs); // Don't need this token, as the type stack will contain the same type + pStackType = PopStackType(); // This is the type to store + PopStackTypeMulti(2); // Don't care what these are + PushOpParam(JIT_STORE_ELEMENT, pStackType->stackSize); + break; + + case CIL_STFLD: + { + tMD_FieldDef *pFieldDef; + + // Get the stack type of the value to store + pStackType = PopStackType(); + PushOp(JIT_STOREFIELD_TYPEID + pStackType->stackType); + // Get the FieldRef or FieldDef of the field to store + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pFieldDef = MetaData_GetFieldDefFromDefOrRef(pMethodDef->pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + PushPTR(pFieldDef); + // Pop the object/valuetype on which to store the field. Don't care what it is + PopStackTypeDontCare(); + } + break; + + case CIL_LDFLD: + { + tMD_FieldDef *pFieldDef; + + // Get the FieldRef or FieldDef of the field to load + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pFieldDef = MetaData_GetFieldDefFromDefOrRef(pMethodDef->pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + // Pop the object/valuetype on which to load the field. + pStackType = PopStackType(); + if (pStackType->stackType == EVALSTACK_VALUETYPE) { + PushOpParam(JIT_LOADFIELD_VALUETYPE, pStackType->stackSize); + PushPTR(pFieldDef); + } else { + if (pFieldDef->memSize <= 4) { + PushOp(JIT_LOADFIELD_4); + PushU32(pFieldDef->memOffset); + } else { + PushOp(JIT_LOADFIELD); + PushPTR(pFieldDef); + } + } + // Push the stack type of the just-read field + PushStackType(pFieldDef->pType); + } + break; + + case CIL_LDFLDA: + { + tMD_FieldDef *pFieldDef; + tMD_TypeDef *pTypeDef; + + // Get the FieldRef or FieldDef of the field to load + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pFieldDef = MetaData_GetFieldDefFromDefOrRef(pMethodDef->pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + // Sometimes, the type def will not have been filled, so ensure it's filled. + pTypeDef = MetaData_GetTypeDefFromFieldDef(pFieldDef); + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + PopStackTypeDontCare(); // Don't care what it is + PushOpParam(JIT_LOAD_FIELD_ADDR, pFieldDef->memOffset); + PushStackType(types[TYPE_SYSTEM_INTPTR]); + } + break; + + case CIL_STSFLD: // Store static field + { + tMD_FieldDef *pFieldDef; + tMD_TypeDef *pTypeDef; + + // Get the FieldRef or FieldDef of the static field to store + PopStackTypeDontCare(); // Don't care what it is + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pFieldDef = MetaData_GetFieldDefFromDefOrRef(pMethodDef->pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + // Sometimes, the type def will not have been filled, so ensure it's filled. + pTypeDef = MetaData_GetTypeDefFromFieldDef(pFieldDef); + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + pStackType = pFieldDef->pType; + PushOp(JIT_STORESTATICFIELD_TYPEID + pStackType->stackType); + PushPTR(pFieldDef); + } + break; + + case CIL_LDSFLD: // Load static field + { + tMD_FieldDef *pFieldDef; + tMD_TypeDef *pTypeDef; + + // Get the FieldRef or FieldDef of the static field to load + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pFieldDef = MetaData_GetFieldDefFromDefOrRef(pMethodDef->pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + // Sometimes, the type def will not have been filled, so ensure it's filled. + pTypeDef = MetaData_GetTypeDefFromFieldDef(pFieldDef); + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + pStackType = pFieldDef->pType; + PushOp(JIT_LOADSTATICFIELD_CHECKTYPEINIT_TYPEID + pStackType->stackType); + PushPTR(pFieldDef); + PushStackType(pStackType); + } + break; + + case CIL_LDSFLDA: // Load static field address + { + tMD_FieldDef *pFieldDef; + tMD_TypeDef *pTypeDef; + + // Get the FieldRef or FieldDef of the field to load + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pFieldDef = MetaData_GetFieldDefFromDefOrRef(pMethodDef->pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + // Sometimes, the type def will not have been filled, so ensure it's filled. + pTypeDef = MetaData_GetTypeDefFromFieldDef(pFieldDef); + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + PushOp(JIT_LOADSTATICFIELDADDRESS_CHECKTYPEINIT); + PushPTR(pFieldDef); + PushStackType(types[TYPE_SYSTEM_INTPTR]); + } + break; + + case CIL_BOX: + { + tMD_TypeDef *pTypeDef; + + pStackType = PopStackType(); + // Get the TypeDef(or Ref) token of the valuetype to box + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pTypeDef = MetaData_GetTypeDefFromDefRefOrSpec(pMethodDef->pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + if (pTypeDef->pGenericDefinition == types[TYPE_SYSTEM_NULLABLE]) { + // This is a nullable type, so special boxing code is needed. + PushOp(JIT_BOX_NULLABLE); + // Push the underlying type of the nullable type, not the nullable type itself + PushPTR(pTypeDef->ppClassTypeArgs[0]); + } else { + PushOp(JIT_BOX_TYPEID + pStackType->stackType); + PushPTR(pTypeDef); + } + // This is correct - cannot push underlying type, as then references are treated as value-types + PushStackType(types[TYPE_SYSTEM_OBJECT]); + } + break; + + case CIL_UNBOX_ANY: + { + tMD_TypeDef *pTypeDef; + + PopStackTypeDontCare(); // Don't care what it is + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pTypeDef = MetaData_GetTypeDefFromDefRefOrSpec(pMethodDef->pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + if (pTypeDef->pGenericDefinition == types[TYPE_SYSTEM_NULLABLE]) { + // This is a nullable type, so special unboxing is required. + PushOp(JIT_UNBOX_NULLABLE); + // For nullable types, push the underlying type + PushPTR(pTypeDef->ppClassTypeArgs[0]); + } else if (pTypeDef->isValueType) { + PushOp(JIT_UNBOX2VALUETYPE); + } else { + PushOp(JIT_UNBOX2OBJECT); + } + PushStackType(pTypeDef); + } + break; + + case CIL_LDTOKEN: + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pMem = MetaData_GetTypeMethodField(pMethodDef->pMetaData, u32Value, &u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + PushOp(JIT_LOADTOKEN_BASE + u32Value); + PushPTR(pMem); + PushStackType(types[ + (u32Value==0)?TYPE_SYSTEM_RUNTIMETYPEHANDLE: + ((u32Value==1)?TYPE_SYSTEM_RUNTIMEFIELDHANDLE:TYPE_SYSTEM_RUNTIMEMETHODHANDLE) + ]); + break; + + case CIL_THROW: + PopStackTypeDontCare(); // Don't care what it is + PushOp(JIT_THROW); + RestoreTypeStack(&typeStack, ppTypeStacks[cilOfs]); + break; + + case CIL_LEAVE_S: + u32Value = (I8)pCIL[cilOfs++]; + goto cilLeave; + + case CIL_LEAVE: + u32Value = GetUnalignedU32(pCIL, &cilOfs); +cilLeave: + // Put a temporary CIL offset value into the JITted code. This will be updated later + u32Value = cilOfs + (I32)u32Value; + MayCopyTypeStack(); + RestoreTypeStack(&typeStack, ppTypeStacks[cilOfs]); + PushOp(JIT_LEAVE); + PushBranch(); + PushU32(u32Value); + break; + + case CIL_ENDFINALLY: + PushOp(JIT_END_FINALLY); + RestoreTypeStack(&typeStack, ppTypeStacks[cilOfs]); + break; + + case CIL_EXTENDED: + op = pCIL[cilOfs++]; + + switch (op) + { + case CILX_INITOBJ: + { + tMD_TypeDef *pTypeDef; + + PopStackTypeDontCare(); // Don't care what it is + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pTypeDef = MetaData_GetTypeDefFromDefRefOrSpec(pMethodDef->pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + if (pTypeDef->isValueType) { + PushOp(JIT_INIT_VALUETYPE); + PushPTR(pTypeDef); + } else { + PushOp(JIT_INIT_OBJECT); + } + } + break; + + case CILX_LOADFUNCTION: + { + tMD_MethodDef *pFuncMethodDef; + + u32Value = GetUnalignedU32(pCIL, &cilOfs); + pFuncMethodDef = MetaData_GetMethodDefFromDefRefOrSpec(pMethodDef->pMetaData, u32Value, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + PushOp(JIT_LOADFUNCTION); + PushPTR(pFuncMethodDef); + PushStackType(types[TYPE_SYSTEM_INTPTR]); + } + break; + + case CILX_CEQ: + case CILX_CGT: + case CILX_CGT_UN: + case CILX_CLT: + case CILX_CLT_UN: + pTypeB = PopStackType(); + pTypeA = PopStackType(); + if ((pTypeA->stackType == EVALSTACK_INT32 && pTypeB->stackType == EVALSTACK_INT32) || + (pTypeA->stackType == EVALSTACK_O && pTypeB->stackType == EVALSTACK_O) || + // Next line: only on 32-bit + (pTypeA->stackType == EVALSTACK_PTR && pTypeB->stackType == EVALSTACK_PTR)) { + PushOp(JIT_CEQ_I32I32 + (op - CILX_CEQ)); + } else if (pTypeA->stackType == EVALSTACK_INT64 && pTypeB->stackType == EVALSTACK_INT64) { + PushOp(JIT_CEQ_I64I64 + (op - CILX_CEQ)); + } else if (pTypeA->stackType == EVALSTACK_F32 && pTypeB->stackType == EVALSTACK_F32) { + PushOp(JIT_CEQ_F32F32 + (op - CILX_CEQ)); + } else if (pTypeA->stackType == EVALSTACK_F64 && pTypeB->stackType == EVALSTACK_F64) { + PushOp(JIT_CEQ_F64F64 + (op - CILX_CEQ)); + } else { + Crash("JITit(): Cannot perform comparison operand on stack types: %s and %s", pTypeA->name, pTypeB->name); + } + PushStackType(types[TYPE_SYSTEM_INT32]); + break; + + case CILX_RETHROW: + PushOp(JIT_RETHROW); + break; + + case CILX_CONSTRAINED: + u32Value2 = GetUnalignedU32(pCIL, &cilOfs); + cilOfs++; + goto cilCallVirtConstrained; + + case CILX_READONLY: + // Do nothing + break; + + default: + Crash("JITit(): JITter cannot handle extended op-code:0x%02x", op); + + } + break; + + default: + Crash("JITit(): JITter cannot handle op-code: 0x%02x", op); + } + + } while (cilOfs < codeSize); + + // Apply branch offset fixes + for (i=0; inumExceptionHandlers; i++) { + tExceptionHeader *pEx; + + pEx = &pJITted->pExceptionHeaders[i]; + pEx->tryEnd = pJITOffsets[pEx->tryStart + pEx->tryEnd]; + pEx->tryStart = pJITOffsets[pEx->tryStart]; + pEx->handlerEnd = pJITOffsets[pEx->handlerStart + pEx->handlerEnd]; + pEx->handlerStart = pJITOffsets[pEx->handlerStart]; +#ifdef GEN_COMBINED_OPCODES + isDynamic.p[pEx->tryStart] |= DYNAMIC_EX_START | DYNAMIC_JUMP_TARGET; + isDynamic.p[pEx->tryEnd] |= DYNAMIC_EX_END | DYNAMIC_JUMP_TARGET; + isDynamic.p[pEx->handlerStart] |= DYNAMIC_EX_START | DYNAMIC_JUMP_TARGET; + isDynamic.p[pEx->handlerEnd] |= DYNAMIC_EX_END | DYNAMIC_JUMP_TARGET; +#endif + } + +#ifdef GEN_COMBINED_OPCODES + // Find any candidates for instruction combining + if (genCombinedOpcodes) { + U32 inst0 = 0; + while (inst0 < ops.ofs) { + U32 opCodeCount = 0; + U32 instCount = 0; + U32 shrinkOpsBy; + U32 isFirstInst; + while (!(isDynamic.p[inst0] & DYNAMIC_OK)) { + inst0++; + if (inst0 >= ops.ofs) { + goto combineDone; + } + } + isFirstInst = 1; + while (isDynamic.p[inst0 + instCount] & DYNAMIC_OK) { + if (isFirstInst) { + isFirstInst = 0; + } else { + if (isDynamic.p[inst0 + instCount] & DYNAMIC_JUMP_TARGET) { + // Cannot span a jump target + break; + } + } + instCount += 1 + ((isDynamic.p[inst0 + instCount] & DYNAMIC_BYTE_COUNT_MASK) >> 2); + opCodeCount++; + } + shrinkOpsBy = 0; + if (opCodeCount > 1) { + U32 combinedSize; + tCombinedOpcodesMem *pCOMem = TMALLOC(tCombinedOpcodesMem); + shrinkOpsBy = GenCombined(&ops, &isDynamic, inst0, instCount, &combinedSize, &pCOMem->pMem); + pCOMem->pNext = pJITted->pCombinedOpcodesMem; + pJITted->pCombinedOpcodesMem = pCOMem; + pJITted->opsMemSize += combinedSize; + memmove(&ops.p[inst0 + instCount - shrinkOpsBy], &ops.p[inst0 + instCount], (ops.ofs - inst0 - instCount) << 2); + memmove(&isDynamic.p[inst0 + instCount - shrinkOpsBy], &isDynamic.p[inst0 + instCount], (ops.ofs - inst0 - instCount) << 2); + ops.ofs -= shrinkOpsBy; + isDynamic.ofs -= shrinkOpsBy; + for (i=0; i inst0) { + branchOffsets.p[i] -= shrinkOpsBy; + } + ofs = branchOffsets.p[i]; + if (ops.p[ofs] > inst0) { + ops.p[ofs] -= shrinkOpsBy; + } + } + for (i=0; inumExceptionHandlers; i++) { + tExceptionHeader *pEx; + + pEx = &pJITted->pExceptionHeaders[i]; + if (pEx->tryStart > inst0) { + pEx->tryStart -= shrinkOpsBy; + } + if (pEx->tryEnd > inst0) { + pEx->tryEnd -= shrinkOpsBy; + } + if (pEx->handlerStart > inst0) { + pEx->handlerStart -= shrinkOpsBy; + } + if (pEx->handlerEnd > inst0) { + pEx->handlerEnd -= shrinkOpsBy; + } + } + } + inst0 += instCount - shrinkOpsBy; + } + } +combineDone: +#endif + + // Change maxStack to indicate the number of bytes needed on the evaluation stack. + // This is the largest number of bytes needed by all objects/value-types on the stack, + pJITted->maxStack = typeStack.maxBytes; + + free(typeStack.ppTypes); + + for (i=0; ippTypes); + } + } + free(ppTypeStacks); + + DeleteOps(branchOffsets); + free(pJITOffsets); + + // Copy ops to some memory of exactly the correct size. To not waste memory. + u32Value = ops.ofs * sizeof(U32); + pFinalOps = genCombinedOpcodes?malloc(u32Value):mallocForever(u32Value); + memcpy(pFinalOps, ops.p, u32Value); + DeleteOps(ops); +#ifdef GEN_COMBINED_OPCODES + pJITted->opsMemSize += u32Value; + DeleteOps(isDynamic); +#endif + + return pFinalOps; +} + +// Prepare a method for execution +// This makes sure that the method has been JITed. +void JIT_Prepare(tMD_MethodDef *pMethodDef, U32 genCombinedOpcodes) { + tMetaData *pMetaData; + U8 *pMethodHeader; + tJITted *pJITted; + FLAGS16 flags; + U32 codeSize; + IDX_TABLE localsToken; + U8 *pCIL; + SIG sig; + U32 i, sigLength, numLocals; + tParameter *pLocals; + + log_f(2, "JIT: %s\n", Sys_GetMethodDesc(pMethodDef)); + + pMetaData = pMethodDef->pMetaData; + pJITted = (genCombinedOpcodes)?TMALLOC(tJITted):TMALLOCFOREVER(tJITted); +#ifdef GEN_COMBINED_OPCODES + pJITted->pCombinedOpcodesMem = NULL; + pJITted->opsMemSize = 0; + if (genCombinedOpcodes) { + pMethodDef->pJITtedCombined = pJITted; + } else { + pMethodDef->pJITted = pJITted; + } +#else + pMethodDef->pJITted = pJITted; +#endif + + if ((pMethodDef->implFlags & METHODIMPLATTRIBUTES_INTERNALCALL) || + ((pMethodDef->implFlags & METHODIMPLATTRIBUTES_CODETYPE_MASK) == METHODIMPLATTRIBUTES_CODETYPE_RUNTIME)) { + tJITCallNative *pCallNative; + + // Internal call + if (strcmp(pMethodDef->name, ".ctor") == 0) { + // Internal constructor needs enough evaluation stack space to return itself + pJITted->maxStack = pMethodDef->pParentType->stackSize; + } else { + pJITted->maxStack = (pMethodDef->pReturnType == NULL)?0:pMethodDef->pReturnType->stackSize; // For return value + } + pCallNative = TMALLOCFOREVER(tJITCallNative); + pCallNative->opCode = Translate(JIT_CALL_NATIVE, 0); + pCallNative->pMethodDef = pMethodDef; + pCallNative->fn = InternalCall_Map(pMethodDef); + pCallNative->retOpCode = Translate(JIT_RETURN, 0); + + pJITted->localsStackSize = 0; + pJITted->pOps = (U32*)pCallNative; + + return; + } + if (pMethodDef->flags & METHODATTRIBUTES_PINVOKEIMPL) { + tJITCallPInvoke *pCallPInvoke; + + // PInvoke call + tMD_ImplMap *pImplMap = MetaData_GetImplMap(pMetaData, pMethodDef->tableIndex); + fnPInvoke fn = PInvoke_GetFunction(pMetaData, pImplMap); + if (fn == NULL) { + Crash("PInvoke library or function not found: %s()", pImplMap->importName); + } + + pCallPInvoke = TMALLOCFOREVER(tJITCallPInvoke); + pCallPInvoke->opCode = Translate(JIT_CALL_PINVOKE, 0); + pCallPInvoke->fn = fn; + pCallPInvoke->pMethod = pMethodDef; + pCallPInvoke->pImplMap = pImplMap; + + pJITted->localsStackSize = 0; + pJITted->maxStack = (pMethodDef->pReturnType == NULL)?0:pMethodDef->pReturnType->stackSize; // For return value + pJITted->pOps = (U32*)pCallPInvoke; + + return; + } + + pMethodHeader = (U8*)pMethodDef->pCIL; + if ((*pMethodHeader & 0x3) == CorILMethod_TinyFormat) { + // Tiny header + flags = *pMethodHeader & 0x3; + pJITted->maxStack = 8; + codeSize = (*pMethodHeader & 0xfc) >> 2; + localsToken = 0; + pCIL = pMethodHeader + 1; + } else { + // Fat header + flags = *(U16*)pMethodHeader & 0x0fff; + pJITted->maxStack = *(U16*)&pMethodHeader[2]; + codeSize = *(U32*)&pMethodHeader[4]; + localsToken = *(IDX_TABLE*)&pMethodHeader[8]; + pCIL = pMethodHeader + ((pMethodHeader[1] & 0xf0) >> 2); + } + if (flags & CorILMethod_MoreSects) { + U32 numClauses; + + pMethodHeader = pCIL + ((codeSize + 3) & (~0x3)); + if (*pMethodHeader & CorILMethod_Sect_FatFormat) { + U32 exSize; + // Fat header + numClauses = ((*(U32*)pMethodHeader >> 8) - 4) / 24; + //pJITted->pExceptionHeaders = (tExceptionHeader*)(pMethodHeader + 4); + exSize = numClauses * sizeof(tExceptionHeader); + pJITted->pExceptionHeaders = + (tExceptionHeader*)(genCombinedOpcodes?malloc(exSize):mallocForever(exSize)); + memcpy(pJITted->pExceptionHeaders, pMethodHeader + 4, exSize); + } else { + // Thin header + tExceptionHeader *pExHeaders; + U32 exSize; + + numClauses = (((U8*)pMethodHeader)[1] - 4) / 12; + exSize = numClauses * sizeof(tExceptionHeader); + pMethodHeader += 4; + //pExHeaders = pJITted->pExceptionHeaders = (tExceptionHeader*)mallocForever(numClauses * sizeof(tExceptionHeader)); + pExHeaders = pJITted->pExceptionHeaders = + (tExceptionHeader*)(genCombinedOpcodes?malloc(exSize):mallocForever(exSize)); + for (i=0; inumExceptionHandlers = numClauses; + // replace all classToken's with the actual tMD_TypeDef* + for (i=0; ipExceptionHeaders[i].flags == COR_ILEXCEPTION_CLAUSE_EXCEPTION) { + pJITted->pExceptionHeaders[i].u.pCatchTypeDef = + MetaData_GetTypeDefFromDefRefOrSpec(pMethodDef->pMetaData, pJITted->pExceptionHeaders[i].u.classToken, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + } + } + } else { + pJITted->numExceptionHandlers = 0; + pJITted->pExceptionHeaders = NULL; + } + + // Analyse the locals + if (localsToken == 0) { + // No locals + pJITted->localsStackSize = 0; + pLocals = NULL; + } else { + tMD_StandAloneSig *pStandAloneSig; + U32 i, totalSize; + + pStandAloneSig = (tMD_StandAloneSig*)MetaData_GetTableRow(pMethodDef->pMetaData, localsToken); + sig = MetaData_GetBlob(pStandAloneSig->signature, &sigLength); + MetaData_DecodeSigEntry(&sig); // Always 0x07 + numLocals = MetaData_DecodeSigEntry(&sig); + pLocals = (tParameter*)malloc(numLocals * sizeof(tParameter)); + totalSize = 0; + for (i=0; ipMetaData, &sig, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + pLocals[i].pTypeDef = pTypeDef; + pLocals[i].offset = totalSize; + pLocals[i].size = pTypeDef->stackSize; + totalSize += pTypeDef->stackSize; + } + pJITted->localsStackSize = totalSize; + } + + // JIT the CIL code + pJITted->pOps = JITit(pMethodDef, pCIL, codeSize, pLocals, pJITted, genCombinedOpcodes); + + free(pLocals); +} \ No newline at end of file diff --git a/dna/JIT.h b/dna/JIT.h new file mode 100644 index 0000000..4dc5575 --- /dev/null +++ b/dna/JIT.h @@ -0,0 +1,130 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined (__JIT_H) +#define __JIT_H + +typedef struct tJITted_ tJITted; +typedef struct tExceptionHeader_ tExceptionHeader; + +#include "Types.h" + +#ifdef GEN_COMBINED_OPCODES +typedef struct tCombinedOpcodesMem_ tCombinedOpcodesMem; +struct tCombinedOpcodesMem_ { + void *pMem; + tCombinedOpcodesMem *pNext; +}; +#endif + +struct tJITted_ { + // The JITted opcodes + U32 *pOps; + // The maximum size of the evaluation stack + U32 maxStack; + // The required size of the locals stack + U32 localsStackSize; + // Number of exception handler headers + U32 numExceptionHandlers; + // Pointer to the exception handler headers (NULL if none) + tExceptionHeader *pExceptionHeaders; +#ifdef GEN_COMBINED_OPCODES + // The number of bytes used by this JITted method - to include ALL bytes: + // The size of the opcodes, plus the size of the combined opcodes. + U32 opsMemSize; + // Store all memory used to store combined opcodes, so they can be free()d later + tCombinedOpcodesMem *pCombinedOpcodesMem; +#endif +}; + +#include "MetaDataTables.h" +#include "Thread.h" + +#define COR_ILEXCEPTION_CLAUSE_EXCEPTION 0 +#define COR_ILEXCEPTION_CLAUSE_FINALLY 2 + +struct tExceptionHeader_ { + U32 flags; + U32 tryStart; + U32 tryEnd; + U32 handlerStart; + U32 handlerEnd; + union { + // Class token for type-based exception handler + IDX_TABLE classToken; + // Filter code offset for filter-based exception handler (not supported) + U32 filterOffset; + // The TypeDef of the catch type + tMD_TypeDef *pCatchTypeDef; + } u; +}; + +typedef struct tJITCallNative_ tJITCallNative; +struct tJITCallNative_ { + U32 opCode; + // The method meta-data + tMD_MethodDef *pMethodDef; + // the native pointer to the function + fnInternalCall fn; + // The RET instruction. This is needed when the native function has blocking IO or sleep + U32 retOpCode; +}; + +typedef struct tJITCallPInvoke_ tJITCallPInvoke; +struct tJITCallPInvoke_ { + U32 opCode; + // The native function to call - type should be fnPInvoke, but there's a problem with #including PInvoke.h + void* fn; + // The method that is being called + tMD_MethodDef *pMethod; + // The ImplMap of the function that's being called + tMD_ImplMap *pImplMap; +}; + +typedef struct tJITCodeInfo_ { + // The beginning and end of the actual native code to run the JIT opcode. + void *pStart; + void *pEnd; + U32 isDynamic; +} tJITCodeInfo; + +#include "JIT_OpCodes.h" + +extern tJITCodeInfo jitCodeInfo[JIT_OPCODE_MAXNUM]; +extern tJITCodeInfo jitCodeGoNext; + +void JIT_Execute_Init(); + +//void JIT_Prepare(tMD_MethodDef *pMethodDef); +void JIT_Prepare(tMD_MethodDef *pMethodDef, U32 genCombinedOpcodes); + +U32 JIT_Execute(tThread *pThread, U32 numInst); + +#ifdef DIAG_OPCODE_TIMES +#include "JIT_OpCodes.h" +extern U64 opcodeTimes[JIT_OPCODE_MAXNUM]; +#endif + +#ifdef DIAG_OPCODE_USE +#include "JIT_OpCodes.h" +extern U32 opcodeNumUses[JIT_OPCODE_MAXNUM]; +#endif + +#endif \ No newline at end of file diff --git a/dna/JIT_Execute.c b/dna/JIT_Execute.c new file mode 100644 index 0000000..31ad61e --- /dev/null +++ b/dna/JIT_Execute.c @@ -0,0 +1,3165 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "JIT.h" + +#include "JIT_OpCodes.h" +#include "MetaData.h" +#include "MetaDataTables.h" +#include "Heap.h" +#include "Type.h" +#include "MethodState.h" +#include "Finalizer.h" +#include "Delegate.h" +#include "PInvoke.h" + +#include "System.String.h" +#include "System.Array.h" + +// Global array which stores the absolute addresses of the start and end of all JIT code +// fragment machine code. +tJITCodeInfo jitCodeInfo[JIT_OPCODE_MAXNUM]; +tJITCodeInfo jitCodeGoNext; + +// Get the next op-code +#define GET_OP() *(pCurOp++) + +// Push a PTR value on the top of the stack +#define PUSH_PTR(ptr) *(PTR*)pCurEvalStack = (PTR)(ptr); pCurEvalStack += sizeof(void*) +// Push an arbitrarily-sized value-type onto the top of the stack +#define PUSH_VALUETYPE(ptr, valueSize, stackInc) memcpy(pCurEvalStack, ptr, valueSize); pCurEvalStack += stackInc +// Push a U32 value on the top of the stack +#define PUSH_U32(value) *(U32*)pCurEvalStack = (U32)(value); pCurEvalStack += 4 +// Push a U64 value on the top of the stack +#define PUSH_U64(value) *(U64*)pCurEvalStack = (U64)(value); pCurEvalStack += 8 +// Push a float value on the top of the stack +#define PUSH_FLOAT(value) *(float*)pCurEvalStack = (float)(value); pCurEvalStack += 4; +// Push a double value on the top of the stack +#define PUSH_DOUBLE(value) *(double*)pCurEvalStack = (double)(value); pCurEvalStack += 8; +// Push a 4-byte heap pointer on to the top of the stack +#define PUSH_O(pHeap) *(void**)pCurEvalStack = (void*)(pHeap); pCurEvalStack += sizeof(void*) +// DUP4() duplicates the top 4 bytes on the eval stack +#define DUP4() *(U32*)pCurEvalStack = *(U32*)(pCurEvalStack - 4); pCurEvalStack += 4 +// DUP8() duplicates the top 4 bytes on the eval stack +#define DUP8() *(U64*)pCurEvalStack = *(U64*)(pCurEvalStack - 8); pCurEvalStack += 8 +// DUP() duplicates numBytes bytes from the top of the stack +#define DUP(numBytes) memcpy(pCurEvalStack, pCurEvalStack - numBytes, numBytes); pCurEvalStack += numBytes +// Pop a U32 value from the stack +#define POP_U32() (*(U32*)(pCurEvalStack -= 4)) +// Pop a U64 value from the stack +#define POP_U64() (*(U64*)(pCurEvalStack -= 8)) +// Pop a float value from the stack +#define POP_FLOAT() (*(float*)(pCurEvalStack -= 4)) +// Pop a double value from the stack +#define POP_DOUBLE() (*(double*)(pCurEvalStack -= 8)) +// Pop 2 U32's from the stack +#define POP_U32_U32(v1,v2) pCurEvalStack -= 8; v1 = *(U32*)pCurEvalStack; v2 = *(U32*)(pCurEvalStack + 4) +// Pop 2 U64's from the stack +#define POP_U64_U64(v1,v2) pCurEvalStack -= 16; v1 = *(U64*)pCurEvalStack; v2 = *(U64*)(pCurEvalStack + 8) +// Pop 2 F32's from the stack +#define POP_F32_F32(v1,v2) pCurEvalStack -= 8; v1 = *(float*)pCurEvalStack; v2 = *(float*)(pCurEvalStack + 4) +// Pop 2 F64's from the stack +#define POP_F64_F64(v1,v2) pCurEvalStack -= 16; v1 = *(double*)pCurEvalStack; v2 = *(double*)(pCurEvalStack + 8) +// Pop a PTR value from the stack +#define POP_PTR() (*(PTR*)(pCurEvalStack -= sizeof(void*))) +// Pop an arbitrarily-sized value-type from the stack (copies it to the specified memory location) +#define POP_VALUETYPE(ptr, valueSize, stackDec) memcpy(ptr, pCurEvalStack -= stackDec, valueSize) +// Pop a Object (heap) pointer value from the stack +#define POP_O() (*(HEAP_PTR*)(pCurEvalStack -= 4)) +// POP() returns nothing - it just alters the stack offset correctly +#define POP(numBytes) pCurEvalStack -= numBytes +// POP_ALL() empties the evaluation stack +#define POP_ALL() pCurEvalStack = pCurrentMethodState->pEvalStack + +#define STACK_ADDR(type) *(type*)(pCurEvalStack - sizeof(type)) +// General binary ops +#define BINARY_OP(returnType, type1, type2, op) \ + pCurEvalStack -= sizeof(type1) + sizeof(type2) - sizeof(returnType); \ + *(returnType*)(pCurEvalStack - sizeof(returnType)) = \ + *(type1*)(pCurEvalStack - sizeof(returnType)) op \ + *(type2*)(pCurEvalStack - sizeof(returnType) + sizeof(type1)) +// General unary ops +#define UNARY_OP(type, op) STACK_ADDR(type) = op STACK_ADDR(type) + +// Set the new method state (for use when the method state changes - in calls mainly) +#define SAVE_METHOD_STATE() \ + pCurrentMethodState->stackOfs = (U32)(pCurEvalStack - pCurrentMethodState->pEvalStack); \ + pCurrentMethodState->ipOffset = (U32)(pCurOp - pOps) + +#define LOAD_METHOD_STATE() \ + pCurrentMethodState = pThread->pCurrentMethodState; \ + pParamsLocals = pCurrentMethodState->pParamsLocals; \ + pCurEvalStack = pCurrentMethodState->pEvalStack + pCurrentMethodState->stackOfs; \ + pJIT = pCurrentMethodState->pJIT; \ + pOps = pJIT->pOps; \ + pCurOp = pOps + pCurrentMethodState->ipOffset + +#define CHANGE_METHOD_STATE(pNewMethodState) \ + SAVE_METHOD_STATE(); \ + pThread->pCurrentMethodState = pNewMethodState; \ + LOAD_METHOD_STATE() + +// Easy access to method parameters and local variables +#define PARAMLOCAL_U32(offset) *(U32*)(pParamsLocals + offset) +#define PARAMLOCAL_U64(offset) *(U64*)(pParamsLocals + offset) + +#define THROW(exType) heapPtr = Heap_AllocType(exType); goto throwHeapPtr + +// Note: newObj is only set if a constructor is being called +static void CreateParameters(PTR pParamsLocals, tMD_MethodDef *pCallMethod, PTR *ppCurEvalStack, HEAP_PTR newObj) { + U32 ofs; + + if (newObj != NULL) { + // If this is being called from JIT_NEW_OBJECT then need to specially push the new object + // onto parameter stack position 0 + *(HEAP_PTR*)pParamsLocals = newObj; + ofs = 4; + } else { + ofs = 0; + } + *ppCurEvalStack -= pCallMethod->parameterStackSize - ofs; + memcpy(pParamsLocals + ofs, *ppCurEvalStack, pCallMethod->parameterStackSize - ofs); +} + +static tMethodState* RunFinalizer(tThread *pThread) { + HEAP_PTR heapPtr = GetNextFinalizer(); + if (heapPtr != NULL) { + // There is a pending finalizer, so create a MethodState for it and put it as next-to-run on the stack + tMethodState *pFinalizerMethodState; + tMD_TypeDef *pFinalizerType = Heap_GetType(heapPtr); + + pFinalizerMethodState = MethodState_Direct(pThread, pFinalizerType->pFinalizer, pThread->pCurrentMethodState, 0); + // Mark this methodState as a Finalizer + pFinalizerMethodState->finalizerThis = heapPtr; + // Put the object on the stack (the object that is being Finalized) + // Finalizers always have no parameters + *(HEAP_PTR*)(pFinalizerMethodState->pParamsLocals) = heapPtr; + //printf("--- FINALIZE ---\n"); + + return pFinalizerMethodState; + } + return NULL; +} + +#ifdef DIAG_OPCODE_TIMES +U64 opcodeTimes[JIT_OPCODE_MAXNUM]; +static __inline unsigned __int64 __cdecl rdtsc() { + __asm { + rdtsc + } +} +#endif + +#ifdef DIAG_OPCODE_USE +U32 opcodeNumUses[JIT_OPCODE_MAXNUM]; + +#define OPCODE_USE(op) opcodeNumUses[op]++; + +#else + +#define OPCODE_USE(op) + +#endif + +#ifdef __GNUC__ + +#define GET_LABEL(var, label) var = &&label + +#define GO_NEXT() goto **(void**)(pCurOp++) + +#else +#ifdef WIN32 + +#define GET_LABEL(var, label) \ + { __asm mov edi, label \ + __asm mov var, edi } + +#define GO_NEXT() \ + { __asm mov edi, pCurOp \ + __asm add edi, 4 \ + __asm mov pCurOp, edi \ + __asm jmp DWORD PTR [edi - 4] } + +#endif +#endif + +#define GO_NEXT_CHECK() \ + if (--numInst == 0) goto done; \ + GO_NEXT() + +#define GET_LABELS(op) \ + GET_LABEL(pAddr, op##_start); \ + jitCodeInfo[op].pStart = pAddr; \ + GET_LABEL(pAddr, op##_end); \ + jitCodeInfo[op].pEnd = pAddr; \ + jitCodeInfo[op].isDynamic = 0 + +#define GET_LABELS_DYNAMIC(op, extraBytes) \ + GET_LABEL(pAddr, op##_start); \ + jitCodeInfo[op].pStart = pAddr; \ + GET_LABEL(pAddr, op##_end); \ + jitCodeInfo[op].pEnd = pAddr; \ + jitCodeInfo[op].isDynamic = 0x100 | (extraBytes & 0xff) + +#define RUN_FINALIZER() {tMethodState *pMS = RunFinalizer(pThread);if(pMS) {CHANGE_METHOD_STATE(pMS);}} + +U32 JIT_Execute(tThread *pThread, U32 numInst) { + tJITted *pJIT; + tMethodState *pCurrentMethodState; + PTR pParamsLocals; + + // Local copies of thread state variables, to speed up execution + // Pointer to next op-code + U32 *pOps; + register U32 *pCurOp; + // Pointer to eval-stack position + register PTR pCurEvalStack; + PTR pTempPtr; + + U32 op; + // General purpose variables + //I32 i32Value; + U32 u32Value; //, u32Value2; + //U64 u64Value; + //double dValue; + //float fValue; + //uConvDouble convDouble; + U32 ofs; + HEAP_PTR heapPtr; + PTR pMem; + + if (pThread == NULL) { + void *pAddr; + // Special case to get all the label addresses + // Default all op-codes to noCode. + GET_LABEL(pAddr, noCode); + for (u32Value = 0; u32Value < JIT_OPCODE_MAXNUM; u32Value++) { + jitCodeInfo[u32Value].pStart = pAddr; + jitCodeInfo[u32Value].pEnd = NULL; + jitCodeInfo[u32Value].isDynamic = 0; + } + + // Get GoNext code + GET_LABEL(jitCodeGoNext.pStart, JIT_GoNext_start); + GET_LABEL(jitCodeGoNext.pEnd, JIT_GoNext_end); + jitCodeGoNext.isDynamic = 0; + + // Get all defined opcodes + GET_LABELS_DYNAMIC(JIT_NOP, 0); + GET_LABELS(JIT_RETURN); + GET_LABELS_DYNAMIC(JIT_LOAD_I32, 4); + GET_LABELS(JIT_BRANCH); + GET_LABELS(JIT_LOAD_STRING); + GET_LABELS(JIT_CALLVIRT_O); + GET_LABELS(JIT_CALL_NATIVE); + GET_LABELS(JIT_CALL_O); + GET_LABELS(JIT_NEWOBJECT); + GET_LABELS(JIT_LOAD_PARAMLOCAL_ADDR); + GET_LABELS(JIT_CALL_PTR); + GET_LABELS(JIT_BOX_CALLVIRT); + GET_LABELS(JIT_INIT_VALUETYPE); + GET_LABELS(JIT_NEW_VECTOR); + GET_LABELS(JIT_NEWOBJECT_VALUETYPE); + GET_LABELS(JIT_IS_INSTANCE); + GET_LABELS(JIT_LOAD_NULL); + GET_LABELS(JIT_UNBOX2VALUETYPE); + GET_LABELS(JIT_UNBOX2OBJECT); + GET_LABELS(JIT_LOAD_FIELD_ADDR); + GET_LABELS(JIT_DUP_GENERAL); + GET_LABELS_DYNAMIC(JIT_POP, 4); + GET_LABELS(JIT_STORE_OBJECT_VALUETYPE); + GET_LABELS(JIT_DEREF_CALLVIRT); + GET_LABELS(JIT_STORE_ELEMENT); + GET_LABELS(JIT_LEAVE); + GET_LABELS(JIT_END_FINALLY); + GET_LABELS(JIT_THROW); + GET_LABELS(JIT_RETHROW); + GET_LABELS(JIT_LOADOBJECT); + GET_LABELS(JIT_LOAD_VECTOR_LEN); + GET_LABELS(JIT_SWITCH); + GET_LABELS(JIT_LOAD_ELEMENT_ADDR); + GET_LABELS(JIT_CALL_INTERFACE); + GET_LABELS(JIT_CAST_CLASS); + GET_LABELS(JIT_LOAD_ELEMENT); + GET_LABELS(JIT_LOADFIELD_VALUETYPE); + GET_LABELS(JIT_LOADFIELD); + GET_LABELS(JIT_LOADFUNCTION); + GET_LABELS(JIT_INVOKE_DELEGATE); + GET_LABELS(JIT_CALL_PINVOKE); + GET_LABELS_DYNAMIC(JIT_LOAD_I64, 8); + GET_LABELS(JIT_INIT_OBJECT); + GET_LABELS_DYNAMIC(JIT_DUP_4, 0); + GET_LABELS_DYNAMIC(JIT_DUP_8, 0); + GET_LABELS(JIT_LOADSTATICFIELDADDRESS_CHECKTYPEINIT); + GET_LABELS_DYNAMIC(JIT_POP_4, 0); + GET_LABELS_DYNAMIC(JIT_LOAD_F32, 4); + + GET_LABELS_DYNAMIC(JIT_LOADPARAMLOCAL_INT64, 4); + GET_LABELS_DYNAMIC(JIT_LOADPARAMLOCAL_INT32, 4); + GET_LABELS_DYNAMIC(JIT_LOADPARAMLOCAL_INTNATIVE, 4); + GET_LABELS_DYNAMIC(JIT_LOADPARAMLOCAL_F32, 4); + GET_LABELS_DYNAMIC(JIT_LOADPARAMLOCAL_F64, 4); + GET_LABELS_DYNAMIC(JIT_LOADPARAMLOCAL_PTR, 4); + GET_LABELS_DYNAMIC(JIT_LOADPARAMLOCAL_O, 4); + GET_LABELS(JIT_LOADPARAMLOCAL_VALUETYPE); + + GET_LABELS_DYNAMIC(JIT_LOADPARAMLOCAL_0, 0); + GET_LABELS_DYNAMIC(JIT_LOADPARAMLOCAL_1, 0); + GET_LABELS_DYNAMIC(JIT_LOADPARAMLOCAL_2, 0); + GET_LABELS_DYNAMIC(JIT_LOADPARAMLOCAL_3, 0); + GET_LABELS_DYNAMIC(JIT_LOADPARAMLOCAL_4, 0); + GET_LABELS_DYNAMIC(JIT_LOADPARAMLOCAL_5, 0); + GET_LABELS_DYNAMIC(JIT_LOADPARAMLOCAL_6, 0); + GET_LABELS_DYNAMIC(JIT_LOADPARAMLOCAL_7, 0); + + GET_LABELS_DYNAMIC(JIT_STOREPARAMLOCAL_INT64, 4); + GET_LABELS_DYNAMIC(JIT_STOREPARAMLOCAL_INT32, 4); + GET_LABELS_DYNAMIC(JIT_STOREPARAMLOCAL_INTNATIVE, 4); + GET_LABELS_DYNAMIC(JIT_STOREPARAMLOCAL_F32, 4); + GET_LABELS_DYNAMIC(JIT_STOREPARAMLOCAL_F64, 4); + GET_LABELS_DYNAMIC(JIT_STOREPARAMLOCAL_PTR, 4); + GET_LABELS_DYNAMIC(JIT_STOREPARAMLOCAL_O, 4); + GET_LABELS(JIT_STOREPARAMLOCAL_VALUETYPE); + + GET_LABELS_DYNAMIC(JIT_STOREPARAMLOCAL_0, 0); + GET_LABELS_DYNAMIC(JIT_STOREPARAMLOCAL_1, 0); + GET_LABELS_DYNAMIC(JIT_STOREPARAMLOCAL_2, 0); + GET_LABELS_DYNAMIC(JIT_STOREPARAMLOCAL_3, 0); + GET_LABELS_DYNAMIC(JIT_STOREPARAMLOCAL_4, 0); + GET_LABELS_DYNAMIC(JIT_STOREPARAMLOCAL_5, 0); + GET_LABELS_DYNAMIC(JIT_STOREPARAMLOCAL_6, 0); + GET_LABELS_DYNAMIC(JIT_STOREPARAMLOCAL_7, 0); + + GET_LABELS(JIT_STOREFIELD_INT64); + GET_LABELS(JIT_STOREFIELD_INT32); + GET_LABELS(JIT_STOREFIELD_INTNATIVE); + GET_LABELS(JIT_STOREFIELD_F32); + GET_LABELS(JIT_STOREFIELD_F64); + GET_LABELS(JIT_STOREFIELD_PTR); + GET_LABELS(JIT_STOREFIELD_O); + GET_LABELS(JIT_STOREFIELD_VALUETYPE); + + GET_LABELS(JIT_LOADSTATICFIELD_CHECKTYPEINIT_INT32); + GET_LABELS(JIT_LOADSTATICFIELD_CHECKTYPEINIT_VALUETYPE); + GET_LABELS(JIT_LOADSTATICFIELD_CHECKTYPEINIT_O); + GET_LABELS(JIT_LOADSTATICFIELD_CHECKTYPEINIT_INTNATIVE); + GET_LABELS(JIT_LOADSTATICFIELD_CHECKTYPEINIT_PTR); + GET_LABELS(JIT_LOADSTATICFIELD_CHECKTYPEINIT_F32); + GET_LABELS(JIT_LOADSTATICFIELD_CHECKTYPEINIT_F64); + + GET_LABELS(JIT_STORESTATICFIELD_INT32); + GET_LABELS(JIT_STORESTATICFIELD_INT64); + GET_LABELS(JIT_STORESTATICFIELD_O); + GET_LABELS(JIT_STORESTATICFIELD_F32); + GET_LABELS(JIT_STORESTATICFIELD_F64); + GET_LABELS(JIT_STORESTATICFIELD_INTNATIVE); + GET_LABELS(JIT_STORESTATICFIELD_PTR); + GET_LABELS(JIT_STORESTATICFIELD_VALUETYPE); + + GET_LABELS(JIT_BOX_INT64); + GET_LABELS(JIT_BOX_INT32); + GET_LABELS(JIT_BOX_INTNATIVE); + GET_LABELS(JIT_BOX_F32); + GET_LABELS(JIT_BOX_F64); + GET_LABELS(JIT_BOX_O); + GET_LABELS(JIT_BOX_VALUETYPE); + + GET_LABELS_DYNAMIC(JIT_CEQ_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_CGT_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_CGT_UN_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_CLT_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_CLT_UN_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_CEQ_I64I64, 0); + GET_LABELS_DYNAMIC(JIT_CGT_I64I64, 0); + GET_LABELS_DYNAMIC(JIT_CGT_UN_I64I64, 0); + GET_LABELS_DYNAMIC(JIT_CLT_I64I64, 0); + GET_LABELS_DYNAMIC(JIT_CLT_UN_I64I64, 0); + + GET_LABELS_DYNAMIC(JIT_ADD_OVF_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_ADD_OVF_UN_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_MUL_OVF_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_MUL_OVF_UN_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_SUB_OVF_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_SUB_OVF_UN_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_ADD_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_SUB_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_MUL_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_DIV_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_DIV_UN_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_REM_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_REM_UN_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_AND_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_OR_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_XOR_I32I32, 0); + GET_LABELS_DYNAMIC(JIT_NEG_I32, 0); + GET_LABELS_DYNAMIC(JIT_NOT_I32, 0); + GET_LABELS_DYNAMIC(JIT_NEG_I64, 0); + GET_LABELS_DYNAMIC(JIT_NOT_I64, 0); + + GET_LABELS(JIT_BOX_NULLABLE); + GET_LABELS_DYNAMIC(JIT_LOAD_F64, 8); + GET_LABELS(JIT_UNBOX_NULLABLE); + + GET_LABELS(JIT_BEQ_I32I32); + GET_LABELS(JIT_BEQ_I64I64); + GET_LABELS(JIT_BEQ_F32F32); + GET_LABELS(JIT_BEQ_F64F64); + + GET_LABELS(JIT_BGE_I32I32); + GET_LABELS(JIT_BGE_I64I64); + GET_LABELS(JIT_BGE_F32F32); + GET_LABELS(JIT_BGE_F64F64); + GET_LABELS(JIT_BGE_UN_F32F32); + GET_LABELS(JIT_BGE_UN_F64F64); + + GET_LABELS(JIT_BGT_I32I32); + GET_LABELS(JIT_BGT_I64I64); + GET_LABELS(JIT_BGT_F32F32); + GET_LABELS(JIT_BGT_F64F64); + GET_LABELS(JIT_BGT_UN_F32F32); + GET_LABELS(JIT_BGT_UN_F64F64); + + GET_LABELS(JIT_BLE_I32I32); + GET_LABELS(JIT_BLE_I64I64); + GET_LABELS(JIT_BLE_F32F32); + GET_LABELS(JIT_BLE_F64F64); + GET_LABELS(JIT_BLE_UN_F32F32); + GET_LABELS(JIT_BLE_UN_F64F64); + + GET_LABELS(JIT_BLT_I32I32); + GET_LABELS(JIT_BLT_I64I64); + GET_LABELS(JIT_BLT_F32F32); + GET_LABELS(JIT_BLT_F64F64); + GET_LABELS(JIT_BLT_UN_F32F32); + GET_LABELS(JIT_BLT_UN_F64F64); + + GET_LABELS(JIT_BNE_UN_I32I32); + GET_LABELS(JIT_BNE_UN_I64I64); + GET_LABELS(JIT_BNE_UN_F32F32); + GET_LABELS(JIT_BNE_UN_F64F64); + + GET_LABELS(JIT_BGE_UN_I32I32); + GET_LABELS(JIT_BGT_UN_I32I32); + GET_LABELS(JIT_BLE_UN_I32I32); + GET_LABELS(JIT_BLT_UN_I32I32); + + GET_LABELS_DYNAMIC(JIT_SHL_I32, 0); + GET_LABELS_DYNAMIC(JIT_SHR_I32, 0); + GET_LABELS_DYNAMIC(JIT_SHR_UN_I32, 0); + GET_LABELS_DYNAMIC(JIT_SHL_I64, 0); + GET_LABELS_DYNAMIC(JIT_SHR_I64, 0); + GET_LABELS_DYNAMIC(JIT_SHR_UN_I64, 0); + + GET_LABELS(JIT_BRANCH_FALSE); + GET_LABELS(JIT_BRANCH_TRUE); + GET_LABELS(JIT_LOADTOKEN_TYPE); + + GET_LABELS(JIT_LOADTOKEN_FIELD); + GET_LABELS(JIT_LOADINDIRECT_I8); + GET_LABELS(JIT_LOADINDIRECT_U8); + GET_LABELS(JIT_LOADINDIRECT_I16); + GET_LABELS(JIT_LOADINDIRECT_U16); + GET_LABELS(JIT_LOADINDIRECT_I32); + GET_LABELS(JIT_LOADINDIRECT_U32); + GET_LABELS(JIT_LOADINDIRECT_I64); + + GET_LABELS(JIT_LOADINDIRECT_R32); + GET_LABELS(JIT_LOADINDIRECT_R64); + GET_LABELS(JIT_LOADINDIRECT_REF); + GET_LABELS(JIT_STOREINDIRECT_REF); + GET_LABELS(JIT_STOREINDIRECT_U8); + GET_LABELS(JIT_STOREINDIRECT_U16); + GET_LABELS(JIT_STOREINDIRECT_U32); + + GET_LABELS_DYNAMIC(JIT_CONV_I32_I32, 4); + GET_LABELS_DYNAMIC(JIT_CONV_I32_U32, 4); + GET_LABELS_DYNAMIC(JIT_CONV_I32_I64, 0); + GET_LABELS_DYNAMIC(JIT_CONV_I32_U64, 0); + GET_LABELS_DYNAMIC(JIT_CONV_I32_R32, 0); + GET_LABELS_DYNAMIC(JIT_CONV_I32_R64, 0); + GET_LABELS_DYNAMIC(JIT_CONV_U32_I32, 4); + GET_LABELS_DYNAMIC(JIT_CONV_U32_U32, 4); + GET_LABELS_DYNAMIC(JIT_CONV_U32_I64, 0); + GET_LABELS_DYNAMIC(JIT_CONV_U32_U64, 0); + GET_LABELS_DYNAMIC(JIT_CONV_U32_R32, 0); + GET_LABELS_DYNAMIC(JIT_CONV_U32_R64, 0); + GET_LABELS_DYNAMIC(JIT_CONV_I64_I32, 4); + GET_LABELS_DYNAMIC(JIT_CONV_I64_U32, 4); + GET_LABELS_DYNAMIC(JIT_CONV_I64_U64, 0); + GET_LABELS_DYNAMIC(JIT_CONV_I64_R32, 0); + GET_LABELS_DYNAMIC(JIT_CONV_I64_R64, 0); + GET_LABELS_DYNAMIC(JIT_CONV_U64_I32, 4); + GET_LABELS_DYNAMIC(JIT_CONV_U64_U32, 4); + GET_LABELS_DYNAMIC(JIT_CONV_U64_I64, 0); + GET_LABELS_DYNAMIC(JIT_CONV_U64_R32, 0); + GET_LABELS_DYNAMIC(JIT_CONV_U64_R64, 0); + GET_LABELS_DYNAMIC(JIT_CONV_R32_I32, 4); + GET_LABELS_DYNAMIC(JIT_CONV_R32_U32, 4); + GET_LABELS_DYNAMIC(JIT_CONV_R32_I64, 0); + GET_LABELS_DYNAMIC(JIT_CONV_R32_U64, 0); + GET_LABELS_DYNAMIC(JIT_CONV_R32_R32, 0); + GET_LABELS_DYNAMIC(JIT_CONV_R32_R64, 0); + GET_LABELS_DYNAMIC(JIT_CONV_R64_I32, 4); + GET_LABELS_DYNAMIC(JIT_CONV_R64_U32, 4); + GET_LABELS_DYNAMIC(JIT_CONV_R64_I64, 0); + GET_LABELS_DYNAMIC(JIT_CONV_R64_U64, 0); + GET_LABELS_DYNAMIC(JIT_CONV_R64_R32, 0); + GET_LABELS_DYNAMIC(JIT_CONV_R64_R64, 0); + + GET_LABELS(JIT_STORE_ELEMENT_32); + GET_LABELS(JIT_STORE_ELEMENT_64); + + GET_LABELS(JIT_LOAD_ELEMENT_I8); + GET_LABELS(JIT_LOAD_ELEMENT_U8); + GET_LABELS(JIT_LOAD_ELEMENT_I16); + GET_LABELS(JIT_LOAD_ELEMENT_U16); + GET_LABELS(JIT_LOAD_ELEMENT_I32); + GET_LABELS(JIT_LOAD_ELEMENT_U32); + GET_LABELS(JIT_LOAD_ELEMENT_I64); + GET_LABELS(JIT_LOAD_ELEMENT_R32); + GET_LABELS(JIT_LOAD_ELEMENT_R64); + + GET_LABELS_DYNAMIC(JIT_ADD_I64I64, 0); + GET_LABELS_DYNAMIC(JIT_SUB_I64I64, 0); + GET_LABELS_DYNAMIC(JIT_MUL_I64I64, 0); + GET_LABELS_DYNAMIC(JIT_DIV_I64I64, 0); + GET_LABELS_DYNAMIC(JIT_DIV_UN_I64I64, 0); + GET_LABELS_DYNAMIC(JIT_REM_I64I64, 0); + GET_LABELS_DYNAMIC(JIT_REM_UN_I64I64, 0); + GET_LABELS_DYNAMIC(JIT_AND_I64I64, 0); + GET_LABELS_DYNAMIC(JIT_OR_I64I64, 0); + GET_LABELS_DYNAMIC(JIT_XOR_I64I64, 0); + + GET_LABELS_DYNAMIC(JIT_CEQ_F32F32, 0); + GET_LABELS_DYNAMIC(JIT_CGT_F32F32, 0); + GET_LABELS_DYNAMIC(JIT_CLT_F32F32, 0); + GET_LABELS_DYNAMIC(JIT_CEQ_F64F64, 0); + GET_LABELS_DYNAMIC(JIT_CGT_F64F64, 0); + GET_LABELS_DYNAMIC(JIT_CLT_F64F64, 0); + + GET_LABELS_DYNAMIC(JIT_ADD_F32F32, 0); + GET_LABELS_DYNAMIC(JIT_ADD_F64F64, 0); + GET_LABELS_DYNAMIC(JIT_SUB_F32F32, 0); + GET_LABELS_DYNAMIC(JIT_SUB_F64F64, 0); + GET_LABELS_DYNAMIC(JIT_MUL_F32F32, 0); + GET_LABELS_DYNAMIC(JIT_MUL_F64F64, 0); + GET_LABELS_DYNAMIC(JIT_DIV_F32F32, 0); + GET_LABELS_DYNAMIC(JIT_DIV_F64F64, 0); + + GET_LABELS_DYNAMIC(JIT_LOAD_I4_M1, 0); + GET_LABELS_DYNAMIC(JIT_LOAD_I4_0, 0); + GET_LABELS_DYNAMIC(JIT_LOAD_I4_1, 0); + GET_LABELS_DYNAMIC(JIT_LOAD_I4_2, 0); + + GET_LABELS_DYNAMIC(JIT_LOADFIELD_4, 4); + + return 0; + } + +#ifdef DIAG_OPCODE_TIMES + U64 opcodeStartTime = rdtsc(); + U32 realOp; +#endif + + LOAD_METHOD_STATE(); + + GO_NEXT(); + +noCode: + Crash("No code for op-code"); + +JIT_NOP_start: +JIT_CONV_R32_R32_start: +JIT_CONV_R64_R64_start: +JIT_CONV_I64_U64_start: +JIT_CONV_U64_I64_start: + OPCODE_USE(JIT_NOP); +JIT_NOP_end: +JIT_CONV_R32_R32_end: +JIT_CONV_R64_R64_end: +JIT_CONV_I64_U64_end: +JIT_CONV_U64_I64_end: +JIT_GoNext_start: + GO_NEXT(); +JIT_GoNext_end: + +JIT_LOAD_NULL_start: + OPCODE_USE(JIT_LOAD_NULL); + PUSH_O(NULL); +JIT_LOAD_NULL_end: + GO_NEXT(); + +JIT_DUP_4_start: + OPCODE_USE(JIT_DUP_4); + DUP4(); +JIT_DUP_4_end: + GO_NEXT(); + +JIT_DUP_8_start: + OPCODE_USE(JIT_DUP_8); + DUP8(); +JIT_DUP_8_end: + GO_NEXT(); + +JIT_DUP_GENERAL_start: + OPCODE_USE(JIT_DUP_GENERAL); + { + U32 dupSize = GET_OP(); + DUP(dupSize); + } +JIT_DUP_GENERAL_end: + GO_NEXT(); + +JIT_POP_start: + OPCODE_USE(JIT_POP); + { + U32 popSize = GET_OP(); + POP(popSize); + } +JIT_POP_end: + GO_NEXT(); + +JIT_POP_4_start: + OPCODE_USE(JIT_POP_4); + POP(4); +JIT_POP_4_end: + GO_NEXT(); + +JIT_LOAD_I32_start: +JIT_LOAD_F32_start: + OPCODE_USE(JIT_LOAD_I32); + { + I32 value = GET_OP(); + PUSH_U32(value); + } +JIT_LOAD_I32_end: +JIT_LOAD_F32_end: + GO_NEXT(); + +JIT_LOAD_I4_M1_start: + OPCODE_USE(JIT_LOAD_I4_M1); + PUSH_U32(-1); +JIT_LOAD_I4_M1_end: + GO_NEXT(); + +JIT_LOAD_I4_0_start: + OPCODE_USE(JIT_LOAD_I4_0); + PUSH_U32(0); +JIT_LOAD_I4_0_end: + GO_NEXT(); + +JIT_LOAD_I4_1_start: + OPCODE_USE(JIT_LOAD_I4_1); + PUSH_U32(1); +JIT_LOAD_I4_1_end: + GO_NEXT(); + +JIT_LOAD_I4_2_start: + OPCODE_USE(JIT_LOAD_I4_2); + PUSH_U32(2); +JIT_LOAD_I4_2_end: + GO_NEXT(); + +JIT_LOAD_I64_start: +JIT_LOAD_F64_start: + OPCODE_USE(JIT_LOAD_I64); + { + U64 value = *(U64*)pCurOp; + pCurOp += 2; + PUSH_U64(value); + } +JIT_LOAD_I64_end: +JIT_LOAD_F64_end: + GO_NEXT(); + +JIT_LOADPARAMLOCAL_INT32_start: +JIT_LOADPARAMLOCAL_F32_start: +JIT_LOADPARAMLOCAL_O_start: +JIT_LOADPARAMLOCAL_INTNATIVE_start: // Only on 32-bit +JIT_LOADPARAMLOCAL_PTR_start: // Only on 32-bit + OPCODE_USE(JIT_LOADPARAMLOCAL_INT32); + { + U32 ofs = GET_OP(); + U32 value = PARAMLOCAL_U32(ofs); + PUSH_U32(value); + } +JIT_LOADPARAMLOCAL_INT32_end: +JIT_LOADPARAMLOCAL_F32_end: +JIT_LOADPARAMLOCAL_O_end: +JIT_LOADPARAMLOCAL_INTNATIVE_end: +JIT_LOADPARAMLOCAL_PTR_end: + GO_NEXT(); + +JIT_LOADPARAMLOCAL_INT64_start: +JIT_LOADPARAMLOCAL_F64_start: + OPCODE_USE(JIT_LOADPARAMLOCAL_INT64); + { + U32 ofs = GET_OP(); + U64 value = PARAMLOCAL_U64(ofs); + PUSH_U64(value); + } +JIT_LOADPARAMLOCAL_INT64_end: +JIT_LOADPARAMLOCAL_F64_end: + GO_NEXT(); + +JIT_LOADPARAMLOCAL_VALUETYPE_start: + OPCODE_USE(JIT_LOADPARAMLOCAL_VALUETYPE); + { + tMD_TypeDef *pTypeDef; + U32 ofs; + PTR pMem; + + ofs = GET_OP(); + pTypeDef = (tMD_TypeDef*)GET_OP(); + pMem = pParamsLocals + ofs; + PUSH_VALUETYPE(pMem, pTypeDef->stackSize, pTypeDef->stackSize); + } +JIT_LOADPARAMLOCAL_VALUETYPE_end: + GO_NEXT(); + +JIT_LOADPARAMLOCAL_0_start: + OPCODE_USE(JIT_LOADPARAMLOCAL_0); + PUSH_U32(PARAMLOCAL_U32(0)); +JIT_LOADPARAMLOCAL_0_end: + GO_NEXT(); + +JIT_LOADPARAMLOCAL_1_start: + OPCODE_USE(JIT_LOADPARAMLOCAL_1); + PUSH_U32(PARAMLOCAL_U32(4)); +JIT_LOADPARAMLOCAL_1_end: + GO_NEXT(); + +JIT_LOADPARAMLOCAL_2_start: + OPCODE_USE(JIT_LOADPARAMLOCAL_2); + PUSH_U32(PARAMLOCAL_U32(8)); +JIT_LOADPARAMLOCAL_2_end: + GO_NEXT(); + +JIT_LOADPARAMLOCAL_3_start: + OPCODE_USE(JIT_LOADPARAMLOCAL_3); + PUSH_U32(PARAMLOCAL_U32(12)); +JIT_LOADPARAMLOCAL_3_end: + GO_NEXT(); + +JIT_LOADPARAMLOCAL_4_start: + OPCODE_USE(JIT_LOADPARAMLOCAL_4); + PUSH_U32(PARAMLOCAL_U32(16)); +JIT_LOADPARAMLOCAL_4_end: + GO_NEXT(); + +JIT_LOADPARAMLOCAL_5_start: + OPCODE_USE(JIT_LOADPARAMLOCAL_5); + PUSH_U32(PARAMLOCAL_U32(20)); +JIT_LOADPARAMLOCAL_5_end: + GO_NEXT(); + +JIT_LOADPARAMLOCAL_6_start: + OPCODE_USE(JIT_LOADPARAMLOCAL_6); + PUSH_U32(PARAMLOCAL_U32(24)); +JIT_LOADPARAMLOCAL_6_end: + GO_NEXT(); + +JIT_LOADPARAMLOCAL_7_start: + OPCODE_USE(JIT_LOADPARAMLOCAL_7); + PUSH_U32(PARAMLOCAL_U32(28)); +JIT_LOADPARAMLOCAL_7_end: + GO_NEXT(); + +JIT_LOAD_PARAMLOCAL_ADDR_start: + OPCODE_USE(JIT_LOAD_PARAMLOCAL_ADDR); + { + U32 ofs = GET_OP(); + PTR pMem = pParamsLocals + ofs; + PUSH_PTR(pMem); + } +JIT_LOAD_PARAMLOCAL_ADDR_end: + GO_NEXT(); + +JIT_STOREPARAMLOCAL_INT32_start: +JIT_STOREPARAMLOCAL_F32_start: +JIT_STOREPARAMLOCAL_O_start: +JIT_STOREPARAMLOCAL_INTNATIVE_start: // Only on 32-bit +JIT_STOREPARAMLOCAL_PTR_start: // Onlt on 32-bit + OPCODE_USE(JIT_STOREPARAMLOCAL_INT32); + { + U32 ofs = GET_OP(); + U32 value = POP_U32(); + PARAMLOCAL_U32(ofs) = value; + } +JIT_STOREPARAMLOCAL_INT32_end: +JIT_STOREPARAMLOCAL_F32_end: +JIT_STOREPARAMLOCAL_O_end: +JIT_STOREPARAMLOCAL_INTNATIVE_end: +JIT_STOREPARAMLOCAL_PTR_end: + GO_NEXT(); + +JIT_STOREPARAMLOCAL_INT64_start: +JIT_STOREPARAMLOCAL_F64_start: + OPCODE_USE(JIT_STOREPARAMLOCAL_INT64); + { + U32 ofs = GET_OP(); + U64 value = POP_U64(); + PARAMLOCAL_U64(ofs) = value; + } +JIT_STOREPARAMLOCAL_INT64_end: +JIT_STOREPARAMLOCAL_F64_end: + GO_NEXT(); + +JIT_STOREPARAMLOCAL_VALUETYPE_start: + OPCODE_USE(JIT_STOREPARAMLOCAL_VALUETYPE); + { + tMD_TypeDef *pTypeDef; + U32 ofs; + PTR pMem; + + ofs = GET_OP(); + pTypeDef = (tMD_TypeDef*)GET_OP(); + pMem = pParamsLocals + ofs; + POP_VALUETYPE(pMem, pTypeDef->stackSize, pTypeDef->stackSize); + } +JIT_STOREPARAMLOCAL_VALUETYPE_end: + GO_NEXT(); + +JIT_STOREPARAMLOCAL_0_start: + OPCODE_USE(JIT_STOREPARAMLOCAL_0); + PARAMLOCAL_U32(0) = POP_U32(); +JIT_STOREPARAMLOCAL_0_end: + GO_NEXT(); + +JIT_STOREPARAMLOCAL_1_start: + OPCODE_USE(JIT_STOREPARAMLOCAL_1); + PARAMLOCAL_U32(4) = POP_U32(); +JIT_STOREPARAMLOCAL_1_end: + GO_NEXT(); + +JIT_STOREPARAMLOCAL_2_start: + OPCODE_USE(JIT_STOREPARAMLOCAL_2); + PARAMLOCAL_U32(8) = POP_U32(); +JIT_STOREPARAMLOCAL_2_end: + GO_NEXT(); + +JIT_STOREPARAMLOCAL_3_start: + OPCODE_USE(JIT_STOREPARAMLOCAL_3); + PARAMLOCAL_U32(12) = POP_U32(); +JIT_STOREPARAMLOCAL_3_end: + GO_NEXT(); + +JIT_STOREPARAMLOCAL_4_start: + OPCODE_USE(JIT_STOREPARAMLOCAL_4); + PARAMLOCAL_U32(16) = POP_U32(); +JIT_STOREPARAMLOCAL_4_end: + GO_NEXT(); + +JIT_STOREPARAMLOCAL_5_start: + OPCODE_USE(JIT_STOREPARAMLOCAL_5); + PARAMLOCAL_U32(20) = POP_U32(); +JIT_STOREPARAMLOCAL_5_end: + GO_NEXT(); + +JIT_STOREPARAMLOCAL_6_start: + OPCODE_USE(JIT_STOREPARAMLOCAL_6); + PARAMLOCAL_U32(24) = POP_U32(); +JIT_STOREPARAMLOCAL_6_end: + GO_NEXT(); + +JIT_STOREPARAMLOCAL_7_start: + OPCODE_USE(JIT_STOREPARAMLOCAL_7); + PARAMLOCAL_U32(28) = POP_U32(); +JIT_STOREPARAMLOCAL_7_end: + GO_NEXT(); + +JIT_LOADINDIRECT_I8_start: +JIT_LOADINDIRECT_I16_start: +JIT_LOADINDIRECT_I32_start: +JIT_LOADINDIRECT_U8_start: +JIT_LOADINDIRECT_U16_start: +JIT_LOADINDIRECT_U32_start: +JIT_LOADINDIRECT_R32_start: +JIT_LOADINDIRECT_REF_start: + OPCODE_USE(JIT_LOADINDIRECT_U32); + { + PTR pMem = POP_PTR(); + U32 value = *(U32*)pMem; + PUSH_U32(value); + } +JIT_LOADINDIRECT_I8_end: +JIT_LOADINDIRECT_I16_end: +JIT_LOADINDIRECT_I32_end: +JIT_LOADINDIRECT_U8_end: +JIT_LOADINDIRECT_U16_end: +JIT_LOADINDIRECT_U32_end: +JIT_LOADINDIRECT_R32_end: +JIT_LOADINDIRECT_REF_end: + GO_NEXT(); + +JIT_LOADINDIRECT_R64_start: +JIT_LOADINDIRECT_I64_start: + OPCODE_USE(JIT_LOADINDIRECT_I64); + { + PTR pMem = POP_PTR(); + U64 value = *(U64*)pMem; + PUSH_U64(value); + } +JIT_LOADINDIRECT_R64_end: +JIT_LOADINDIRECT_I64_end: + GO_NEXT(); + +JIT_STOREINDIRECT_U8_start: +JIT_STOREINDIRECT_U16_start: +JIT_STOREINDIRECT_U32_start: +JIT_STOREINDIRECT_REF_start: + OPCODE_USE(JIT_STOREINDIRECT_U32); + { + U32 value = POP_U32(); // The value to store + PTR pMem = POP_PTR(); // The address to store to + *(U32*)pMem = value; + } +JIT_STOREINDIRECT_U8_end: +JIT_STOREINDIRECT_U16_end: +JIT_STOREINDIRECT_U32_end: +JIT_STOREINDIRECT_REF_end: + GO_NEXT(); + +JIT_STORE_OBJECT_VALUETYPE_start: + OPCODE_USE(JIT_STORE_OBJECT_VALUETYPE); + { + U32 size = GET_OP(); // The size, in bytes, of the value-type to store + U32 memSize = (size<4)?4:size; + PTR pMem = pCurEvalStack - memSize - sizeof(void*); + POP_VALUETYPE(*(void**)pMem, size, memSize); + POP(4); + } +JIT_STORE_OBJECT_VALUETYPE_end: + GO_NEXT(); + +JIT_CALL_PINVOKE_start: + OPCODE_USE(JIT_CALL_PINVOKE); + { + tJITCallPInvoke *pCallPInvoke; + U32 res; + + pCallPInvoke = (tJITCallPInvoke*)(pCurOp - 1); + res = PInvoke_Call(pCallPInvoke, pParamsLocals, pCurrentMethodState->pEvalStack); + pCurrentMethodState->stackOfs = res; + } + goto JIT_RETURN_start; +JIT_CALL_PINVOKE_end: + +JIT_CALL_NATIVE_start: + OPCODE_USE(JIT_CALL_NATIVE); + { + tJITCallNative *pCallNative; + PTR pThis; + U32 thisOfs; + tAsyncCall *pAsync; + + //pCallNative = (tJITCallNative*)&(pJIT->pOps[pCurrentMethodState->ipOffset - 1]); + pCallNative = (tJITCallNative*)(pCurOp - 1); + if (METHOD_ISSTATIC(pCallNative->pMethodDef)) { + pThis = NULL; + thisOfs = 0; + } else { + pThis = *(PTR*)pCurrentMethodState->pParamsLocals; + thisOfs = 4; + } + // Internal constructors MUST leave the newly created object in the return value + // (ie on top of the evaluation stack) + pAsync = pCallNative->fn(pThis, pCurrentMethodState->pParamsLocals + thisOfs, pCurrentMethodState->pEvalStack); + if (pAsync != NULL) { + // Save the method state + SAVE_METHOD_STATE(); + // Change the IP pointer to point to the return instruction + pCurrentMethodState->ipOffset = 3; + // Handle special async codes + if (pAsync == ASYNC_LOCK_EXIT) { + return THREAD_STATUS_LOCK_EXIT; + } + // Set the async in the thread + pThread->pAsync = pAsync; + return THREAD_STATUS_ASYNC; + } + } + // fall-through +JIT_CALL_NATIVE_end: + +JIT_RETURN_start: + OPCODE_USE(JIT_RETURN); + //printf("Returned from %s() to %s()\n", pCurrentMethodState->pMethod->name, (pCurrentMethodState->pCaller)?pCurrentMethodState->pCaller->pMethod->name:""); + if (pCurrentMethodState->pCaller == NULL) { + // End of thread! + if (pCurrentMethodState->pMethod->pReturnType == types[TYPE_SYSTEM_INT32]) { + // If function returned an int32, then make it the thread exit-value + pThread->threadExitValue = (I32)POP_U32(); + } + return THREAD_STATUS_EXIT; + } + // Make u32Value the number of bytes of the return value from the function + if (pCurrentMethodState->pMethod->pReturnType != NULL) { + u32Value = pCurrentMethodState->pMethod->pReturnType->stackSize; + } else if (pCurrentMethodState->isInternalNewObjCall) { + u32Value = sizeof(void*); + } else { + u32Value = 0; + } + pMem = pCurrentMethodState->pEvalStack; + { + tMethodState *pOldMethodState = pCurrentMethodState; + pThread->pCurrentMethodState = pCurrentMethodState->pCaller; + LOAD_METHOD_STATE(); + // Copy return value to callers evaluation stack + if (u32Value > 0) { + memmove(pCurEvalStack, pMem, u32Value); + pCurEvalStack += u32Value; + } + // Delete the current method state and go back to callers method state + MethodState_Delete(pThread, &pOldMethodState); + } + if (pCurrentMethodState->pNextDelegate == NULL) { + GO_NEXT(); + } + // Fall-through if more delegate methods to invoke +JIT_RETURN_end: + +JIT_INVOKE_DELEGATE_start: + OPCODE_USE(JIT_INVOKE_DELEGATE); + { + tMD_MethodDef *pDelegateMethod, *pCallMethod; + void *pDelegate; + HEAP_PTR pDelegateThis; + tMethodState *pCallMethodState; + U32 ofs; + + if (pCurrentMethodState->pNextDelegate == NULL) { + // First delegate, so get the Invoke() method defined within the delegate class + pDelegateMethod = (tMD_MethodDef*)GET_OP(); + // Take the params off the stack. This is the pointer to the tDelegate & params + //pCurrentMethodState->stackOfs -= pDelegateMethod->parameterStackSize; + pCurEvalStack -= pDelegateMethod->parameterStackSize; + // Allocate memory for delegate params + pCurrentMethodState->pDelegateParams = malloc(pDelegateMethod->parameterStackSize - sizeof(void*)); + memcpy( + pCurrentMethodState->pDelegateParams, + //pCurrentMethodState->pEvalStack + pCurrentMethodState->stackOfs + sizeof(void*), + pCurEvalStack + sizeof(void*), + pDelegateMethod->parameterStackSize - sizeof(void*)); + // Get the actual delegate heap pointer + pDelegate = *(void**)pCurEvalStack; + } else { + pDelegateMethod = Delegate_GetMethod(pCurrentMethodState->pNextDelegate); + if (pDelegateMethod->pReturnType != NULL) { + pCurEvalStack -= pDelegateMethod->pReturnType->stackSize; + } + // Get the actual delegate heap pointer + pDelegate = pCurrentMethodState->pNextDelegate; + } + if (pDelegate == NULL) { + THROW(types[TYPE_SYSTEM_NULLREFERENCEEXCEPTION]); + } + // Get the real method to call; the target of the delegate. + pCallMethod = Delegate_GetMethodAndStore(pDelegate, &pDelegateThis, &pCurrentMethodState->pNextDelegate); + // Set up the call method state for the call. + pCallMethodState = MethodState_Direct(pThread, pCallMethod, pCurrentMethodState, 0); + if (pDelegateThis != NULL) { + *(HEAP_PTR*)pCallMethodState->pParamsLocals = pDelegateThis; + ofs = sizeof(void*); + } else { + ofs = 0; + } + memcpy(pCallMethodState->pParamsLocals + ofs, + pCurrentMethodState->pDelegateParams, + pCallMethod->parameterStackSize - ofs); + CHANGE_METHOD_STATE(pCallMethodState); + } +JIT_INVOKE_DELEGATE_end: + GO_NEXT(); + +JIT_DEREF_CALLVIRT_start: + op = JIT_DEREF_CALLVIRT; + goto allCallStart; +JIT_BOX_CALLVIRT_start: + op = JIT_BOX_CALLVIRT; + goto allCallStart; +JIT_CALL_PTR_start: // Note that JIT_CALL_PTR cannot be virtual + op = JIT_CALL_PTR; + goto allCallStart; +JIT_CALLVIRT_O_start: + op = JIT_CALLVIRT_O; + goto allCallStart; +JIT_CALL_O_start: + op = JIT_CALL_O; + goto allCallStart; +JIT_CALL_INTERFACE_start: + op = JIT_CALL_INTERFACE; +allCallStart: + OPCODE_USE(JIT_CALL_O); + { + tMD_MethodDef *pCallMethod; + tMethodState *pCallMethodState; + tMD_TypeDef *pBoxCallType; + + if (op == JIT_BOX_CALLVIRT) { + pBoxCallType = (tMD_TypeDef*)GET_OP(); + } + + pCallMethod = (tMD_MethodDef*)GET_OP(); + heapPtr = NULL; + + if (op == JIT_BOX_CALLVIRT) { + // Need to de-ref and box the value-type before calling the function + // TODO: Will this work on value-types that are not 4 bytes long? + pMem = pCurEvalStack - pCallMethod->parameterStackSize; + heapPtr = Heap_Box(pBoxCallType, *(PTR*)pMem); + *(HEAP_PTR*)pMem = heapPtr; + } else if (op == JIT_DEREF_CALLVIRT) { + pMem = pCurEvalStack - pCallMethod->parameterStackSize; + *(HEAP_PTR*)pMem = **(HEAP_PTR**)pMem; + } + + // If it's a virtual call then find the real correct method to call + if (op == JIT_CALLVIRT_O || op == JIT_BOX_CALLVIRT || op == JIT_DEREF_CALLVIRT) { + tMD_TypeDef *pThisType; + // Get the actual object that is becoming 'this' + if (heapPtr == NULL) { + heapPtr = *(HEAP_PTR*)(pCurEvalStack - pCallMethod->parameterStackSize); + } + if (heapPtr == NULL) { + //Crash("NULL 'this' in Virtual call: %s", Sys_GetMethodDesc(pCallMethod)); + THROW(types[TYPE_SYSTEM_NULLREFERENCEEXCEPTION]); + } + pThisType = Heap_GetType(heapPtr); + if (METHOD_ISVIRTUAL(pCallMethod)) { + pCallMethod = pThisType->pVTable[pCallMethod->vTableOfs]; + } + } else if (op == JIT_CALL_INTERFACE) { + tMD_TypeDef *pInterface, *pThisType; + U32 vIndex; + I32 i; + + pInterface = pCallMethod->pParentType; + // Get the actual object that is becoming 'this' + heapPtr = *(HEAP_PTR*)(pCurEvalStack - pCallMethod->parameterStackSize); + pThisType = Heap_GetType(heapPtr); + // Find the interface mapping on the 'this' type. + vIndex = 0xffffffff; + // This must be searched backwards so if an interface is implemented more than + // once in the type hierarchy, the most recent definition gets called + for (i=(I32)pThisType->numInterfaces-1; i >= 0; i--) { + if (pThisType->pInterfaceMaps[i].pInterface == pInterface) { + // Found the right interface map + if (pThisType->pInterfaceMaps[i].pVTableLookup != NULL) { + vIndex = pThisType->pInterfaceMaps[i].pVTableLookup[pCallMethod->vTableOfs]; + break; + } + pCallMethod = pThisType->pInterfaceMaps[i].ppMethodVLookup[pCallMethod->vTableOfs]; + goto callMethodSet; + } + } + Assert(vIndex != 0xffffffff); + pCallMethod = pThisType->pVTable[vIndex]; + } +callMethodSet: + //printf("Calling method: %s\n", Sys_GetMethodDesc(pCallMethod)); + // Set up the new method state for the called method + pCallMethodState = MethodState_Direct(pThread, pCallMethod, pCurrentMethodState, 0); + // Set up the parameter stack for the method being called + pTempPtr = pCurEvalStack; + CreateParameters(pCallMethodState->pParamsLocals, pCallMethod, &/*pCurEvalStack*/pTempPtr, NULL); + pCurEvalStack = pTempPtr; + // Set up the local variables for the new method state + CHANGE_METHOD_STATE(pCallMethodState); + } +JIT_DEREF_CALLVIRT_end: +JIT_BOX_CALLVIRT_end: +JIT_CALL_PTR_end: +JIT_CALLVIRT_O_end: +JIT_CALL_O_end: +JIT_CALL_INTERFACE_end: + GO_NEXT_CHECK(); + +JIT_BRANCH_start: + OPCODE_USE(JIT_BRANCH); + { + U32 ofs = GET_OP(); + pCurOp = pOps + ofs; + } +JIT_BRANCH_end: + GO_NEXT_CHECK(); + +JIT_SWITCH_start: + OPCODE_USE(JIT_SWITCH); + { + U32 ofs; + // The number of jump targets + U32 numTargets = GET_OP(); + // The jump target selected + U32 target = POP_U32(); + if (target >= numTargets) { + // This is not a valid jump target, so fall-through + pCurOp += numTargets; + goto JIT_SWITCH_end; + } + ofs = *(pCurOp + target); + pCurOp = pOps + ofs; + } +JIT_SWITCH_end: + GO_NEXT_CHECK(); + +JIT_BRANCH_TRUE_start: + OPCODE_USE(JIT_BRANCH_TRUE); + { + U32 value = POP_U32(); + U32 ofs = GET_OP(); + if (value != 0) { + pCurOp = pOps + ofs; + } + } +JIT_BRANCH_TRUE_end: + GO_NEXT_CHECK(); + +JIT_BRANCH_FALSE_start: + OPCODE_USE(JIT_BRANCH_FALSE); + { + U32 value = POP_U32(); + U32 ofs = GET_OP(); + if (value == 0) { + pCurOp = pOps + ofs; + } + } +JIT_BRANCH_FALSE_end: + GO_NEXT_CHECK(); + +JIT_BEQ_I32I32_start: + OPCODE_USE(JIT_BEQ_I32I32); + { + U32 v1, v2, ofs; + POP_U32_U32(v1, v2); + ofs = GET_OP(); + if ((I32)v1 == (I32)v2) { + pCurOp = pOps + ofs; + } + } +JIT_BEQ_I32I32_end: + GO_NEXT_CHECK(); + +JIT_BEQ_I64I64_start: + OPCODE_USE(JIT_BEQ_I64I64); + { + U64 v1, v2; + U32 ofs; + POP_U64_U64(v1, v2); + ofs = GET_OP(); + if ((I64)v1 == (I64)v2) { + pCurOp = pOps + ofs; + } + } +JIT_BEQ_I64I64_end: + GO_NEXT_CHECK(); + +JIT_BEQ_F32F32_start: + OPCODE_USE(JIT_BEQ_F32F32); + { + float v1, v2; + U32 ofs; + POP_F32_F32(v1, v2); + ofs = GET_OP(); + if (v1 == v2) { + pCurOp = pOps + ofs; + } + } +JIT_BEQ_F32F32_end: + GO_NEXT_CHECK(); + +JIT_BEQ_F64F64_start: + OPCODE_USE(JIT_BEQ_F64F64); + { + double v1, v2; + U32 ofs; + POP_F64_F64(v1, v2); + ofs = GET_OP(); + if (v1 == v2) { + pCurOp = pOps + ofs; + } + } +JIT_BEQ_F64F64_end: + GO_NEXT_CHECK(); + +JIT_BGE_I32I32_start: + OPCODE_USE(JIT_BGE_I32I32); + { + U32 v1, v2, ofs; + POP_U32_U32(v1, v2); + ofs = GET_OP(); + if ((I32)v1 >= (I32)v2) { + pCurOp = pOps + ofs; + } + } +JIT_BGE_I32I32_end: + GO_NEXT_CHECK(); + +JIT_BGE_I64I64_start: + OPCODE_USE(JIT_BGE_I64I64); + { + U64 v1, v2; + U32 ofs; + POP_U64_U64(v1, v2); + ofs = GET_OP(); + if ((I64)v1 >= (I64)v2) { + pCurOp = pOps + ofs; + } + } +JIT_BGE_I64I64_end: + GO_NEXT_CHECK(); + +JIT_BGE_F32F32_start: +JIT_BGE_UN_F32F32_start: + OPCODE_USE(JIT_BGE_F32F32); + { + float v1, v2; + U32 ofs; + POP_F32_F32(v1, v2); + ofs = GET_OP(); + if (v1 >= v2) { + pCurOp = pOps + ofs; + } + } +JIT_BGE_F32F32_end: +JIT_BGE_UN_F32F32_end: + GO_NEXT_CHECK(); + +JIT_BGE_F64F64_start: +JIT_BGE_UN_F64F64_start: + OPCODE_USE(JIT_BGE_F64F64); + { + double v1, v2; + U32 ofs; + POP_F64_F64(v1, v2); + ofs = GET_OP(); + if (v1 >= v2) { + pCurOp = pOps + ofs; + } + } +JIT_BGE_F64F64_end: +JIT_BGE_UN_F64F64_end: + GO_NEXT_CHECK(); + +JIT_BGT_I32I32_start: + OPCODE_USE(JIT_BGT_I32I32); + { + U32 v1, v2; + U32 ofs; + POP_U32_U32(v1, v2); + ofs = GET_OP(); + if ((I32)v1 > (I32)v2) { + pCurOp = pOps + ofs; + } + } +JIT_BGT_I32I32_end: + GO_NEXT_CHECK(); + +JIT_BGT_I64I64_start: + OPCODE_USE(JIT_BGT_I64I64); + { + U64 v1, v2; + U32 ofs; + POP_U64_U64(v1, v2); + ofs = GET_OP(); + if ((I64)v1 > (I64)v2) { + pCurOp = pOps + ofs; + } + } +JIT_BGT_I64I64_end: + GO_NEXT_CHECK(); + +JIT_BGT_F32F32_start: +JIT_BGT_UN_F32F32_start: + OPCODE_USE(JIT_BGT_F32F32); + { + float v1, v2; + U32 ofs; + POP_F32_F32(v1, v2); + ofs = GET_OP(); + if (v1 > v2) { + pCurOp = pOps + ofs; + } + } +JIT_BGT_F32F32_end: +JIT_BGT_UN_F32F32_end: + GO_NEXT_CHECK(); + +JIT_BGT_F64F64_start: +JIT_BGT_UN_F64F64_start: + OPCODE_USE(JIT_BGT_F64F64); + { + double v1, v2; + U32 ofs; + POP_F64_F64(v1, v2); + ofs = GET_OP(); + if (v1 > v2) { + pCurOp = pOps + ofs; + } + } +JIT_BGT_F64F64_end: +JIT_BGT_UN_F64F64_end: + GO_NEXT_CHECK(); + +JIT_BLE_I32I32_start: + OPCODE_USE(JIT_BLE_I32I32); + { + U32 v1, v2; + U32 ofs; + POP_U32_U32(v1, v2); + ofs = GET_OP(); + if ((I32)v1 <= (I32)v2) { + pCurOp = pOps + ofs; + } + } +JIT_BLE_I32I32_end: + GO_NEXT_CHECK(); + +JIT_BLE_I64I64_start: + OPCODE_USE(JIT_BLE_I64I64); + { + U64 v1, v2; + U32 ofs; + POP_U64_U64(v1, v2); + ofs = GET_OP(); + if ((I64)v1 <= (I64)v2) { + pCurOp = pOps + ofs; + } + } +JIT_BLE_I64I64_end: + GO_NEXT_CHECK(); + +JIT_BLE_F32F32_start: +JIT_BLE_UN_F32F32_start: + OPCODE_USE(JIT_BLE_F32F32); + { + float v1, v2; + U32 ofs; + POP_F32_F32(v1, v2); + ofs = GET_OP(); + if (v1 <= v2) { + pCurOp = pOps + ofs; + } + } +JIT_BLE_F32F32_end: +JIT_BLE_UN_F32F32_end: + GO_NEXT_CHECK(); + +JIT_BLE_F64F64_start: +JIT_BLE_UN_F64F64_start: + OPCODE_USE(JIT_BLE_F64F64); + { + double v1, v2; + U32 ofs; + POP_F64_F64(v1, v2); + ofs = GET_OP(); + if (v1 <= v2) { + pCurOp = pOps + ofs; + } + } +JIT_BLE_F64F64_end: +JIT_BLE_UN_F64F64_end: + GO_NEXT_CHECK(); + +JIT_BLT_I32I32_start: + OPCODE_USE(JIT_BLT_I32I32); + { + U32 v1, v2; + U32 ofs; + POP_U32_U32(v1, v2); + ofs = GET_OP(); + if ((I32)v1 < (I32)v2) { + pCurOp = pOps + ofs; + } + } +JIT_BLT_I32I32_end: + GO_NEXT_CHECK(); + +JIT_BLT_I64I64_start: + OPCODE_USE(JIT_BLT_I64I64); + { + U64 v1, v2; + U32 ofs; + POP_U64_U64(v1, v2); + ofs = GET_OP(); + if ((I64)v1 < (I64)v2) { + pCurOp = pOps + ofs; + } + } +JIT_BLT_I64I64_end: + GO_NEXT_CHECK(); + +JIT_BLT_F32F32_start: +JIT_BLT_UN_F32F32_start: + OPCODE_USE(JIT_BLT_F32F32); + { + float v1, v2; + U32 ofs; + POP_F32_F32(v1, v2); + ofs = GET_OP(); + if (v1 < v2) { + pCurOp = pOps + ofs; + } + } +JIT_BLT_F32F32_end: +JIT_BLT_UN_F32F32_end: + GO_NEXT_CHECK(); + +JIT_BLT_F64F64_start: +JIT_BLT_UN_F64F64_start: + OPCODE_USE(JIT_BLT_F64F64); + { + double v1, v2; + U32 ofs; + POP_F64_F64(v1, v2); + ofs = GET_OP(); + if (v1 < v2) { + pCurOp = pOps + ofs; + } + } +JIT_BLT_F64F64_end: +JIT_BLT_UN_F64F64_end: + GO_NEXT_CHECK(); + +JIT_BNE_UN_I32I32_start: + OPCODE_USE(JIT_BNE_UN_I32I32); + { + U32 v1, v2, ofs; + POP_U32_U32(v1, v2); + ofs = GET_OP(); + if (v1 != v2) { + pCurOp = pOps + ofs; + } + } +JIT_BNE_UN_I32I32_end: + GO_NEXT_CHECK(); + +JIT_BNE_UN_I64I64_start: + OPCODE_USE(JIT_BNE_UN_I64I64); + { + U64 v1, v2; + U32 ofs; + POP_U64_U64(v1, v2); + ofs = GET_OP(); + if (v1 != v2) { + pCurOp = pOps + ofs; + } + } +JIT_BNE_UN_I64I64_end: + GO_NEXT_CHECK(); + +JIT_BNE_UN_F32F32_start: + OPCODE_USE(JIT_BNE_UN_F32F32); + { + float v1, v2; + U32 ofs; + POP_F32_F32(v1, v2); + ofs = GET_OP(); + if (v1 != v2) { + pCurOp = pOps + ofs; + } + } +JIT_BNE_UN_F32F32_end: + GO_NEXT_CHECK(); + +JIT_BNE_UN_F64F64_start: + OPCODE_USE(JIT_BNE_UN_F64F64); + { + double v1, v2; + U32 ofs; + POP_F64_F64(v1, v2); + ofs = GET_OP(); + if (v1 != v2) { + pCurOp = pOps + ofs; + } + } +JIT_BNE_UN_F64F64_end: + GO_NEXT_CHECK(); + +JIT_BGE_UN_I32I32_start: + OPCODE_USE(JIT_BGE_UN_I32I32); + { + U32 v1, v2, ofs; + POP_U32_U32(v1, v2); + ofs = GET_OP(); + if (v1 >= v2) { + pCurOp = pOps + ofs; + } + } +JIT_BGE_UN_I32I32_end: + GO_NEXT_CHECK(); + +JIT_BGT_UN_I32I32_start: + OPCODE_USE(JIT_BGT_UN_I32I32); + { + U32 v1, v2, ofs; + POP_U32_U32(v1, v2); + ofs = GET_OP(); + if (v1 > v2) { + pCurOp = pOps + ofs; + } + } +JIT_BGT_UN_I32I32_end: + GO_NEXT_CHECK(); + +JIT_BLE_UN_I32I32_start: + OPCODE_USE(JIT_BLE_UN_I32I32); + { + U32 v1, v2, ofs; + POP_U32_U32(v1, v2); + ofs = GET_OP(); + if (v1 <= v2) { + pCurOp = pOps + ofs; + } + } +JIT_BLE_UN_I32I32_end: + GO_NEXT_CHECK(); + +JIT_BLT_UN_I32I32_start: + OPCODE_USE(JIT_BLT_UN_I32I32); + { + U32 v1, v2, ofs; + POP_U32_U32(v1, v2); + ofs = GET_OP(); + if (v1 < v2) { + pCurOp = pOps + ofs; + } + } +JIT_BLT_UN_I32I32_end: + GO_NEXT_CHECK(); + +JIT_CEQ_I32I32_start: // Handles I32 and O + OPCODE_USE(JIT_CEQ_I32I32); + BINARY_OP(U32, U32, U32, ==); +JIT_CEQ_I32I32_end: + GO_NEXT(); + +JIT_CGT_I32I32_start: + OPCODE_USE(JIT_CGT_I32I32); + BINARY_OP(U32, I32, I32, >); +JIT_CGT_I32I32_end: + GO_NEXT(); + +JIT_CGT_UN_I32I32_start: // Handles I32 and O + OPCODE_USE(JIT_CGT_UN_I32I32); + BINARY_OP(U32, U32, U32, >); +JIT_CGT_UN_I32I32_end: + GO_NEXT(); + +JIT_CLT_I32I32_start: + OPCODE_USE(JIT_CLT_I32I32); + BINARY_OP(U32, I32, I32, <); +JIT_CLT_I32I32_end: + GO_NEXT(); + +JIT_CLT_UN_I32I32_start: + OPCODE_USE(JIT_CLT_UN_I32I32); + BINARY_OP(U32, U32, U32, <); +JIT_CLT_UN_I32I32_end: + GO_NEXT(); + +JIT_CEQ_I64I64_start: + OPCODE_USE(JIT_CEQ_I64I64); + BINARY_OP(U32, U64, U64, ==); +JIT_CEQ_I64I64_end: + GO_NEXT(); + +JIT_CGT_I64I64_start: + OPCODE_USE(JIT_CGT_I64I64); + BINARY_OP(U32, I64, I64, >); +JIT_CGT_I64I64_end: + GO_NEXT(); + +JIT_CGT_UN_I64I64_start: + OPCODE_USE(JIT_CGT_UN_I64I64); + BINARY_OP(U32, U64, U64, >); +JIT_CGT_UN_I64I64_end: + GO_NEXT(); + +JIT_CLT_I64I64_start: + OPCODE_USE(JIT_CLT_I64I64); + BINARY_OP(U32, I64, I64, <); +JIT_CLT_I64I64_end: + GO_NEXT(); + +JIT_CLT_UN_I64I64_start: + OPCODE_USE(JIT_CLT_UN_I64I64); + BINARY_OP(U32, U64, U64, <); +JIT_CLT_UN_I64I64_end: + GO_NEXT(); + +JIT_CEQ_F32F32_start: + OPCODE_USE(JIT_CEQ_F32F32); + BINARY_OP(U32, float, float, ==); +JIT_CEQ_F32F32_end: + GO_NEXT(); + +JIT_CEQ_F64F64_start: + OPCODE_USE(JIT_CEQ_F64F64); + BINARY_OP(U32, double, double, ==); +JIT_CEQ_F64F64_end: + GO_NEXT(); + +JIT_CGT_F32F32_start: + OPCODE_USE(JIT_CGT_F32F32); + BINARY_OP(U32, float, float, >); +JIT_CGT_F32F32_end: + GO_NEXT(); + +JIT_CGT_F64F64_start: + OPCODE_USE(JIT_CGT_F64F64); + BINARY_OP(U32, double, double, >); +JIT_CGT_F64F64_end: + GO_NEXT(); + +JIT_CLT_F32F32_start: + OPCODE_USE(JIT_CLT_F32F32); + BINARY_OP(U32, float, float, <); +JIT_CLT_F32F32_end: + GO_NEXT(); + +JIT_CLT_F64F64_start: + OPCODE_USE(JIT_CLT_F64F64); + BINARY_OP(U32, double, double, <); +JIT_CLT_F64F64_end: + GO_NEXT(); + +JIT_ADD_OVF_I32I32_start: + OPCODE_USE(JIT_ADD_OVF_I32I32); + { + U32 v1, v2; + I64 res; + POP_U32_U32(v1, v2); + res = (I64)(I32)v1 + (I64)(I32)v2; + if (res > (I64)0x7fffffff || res < (I64)0xffffffff80000000) { + // Overflowed, so throw exception + THROW(types[TYPE_SYSTEM_OVERFLOWEXCEPTION]); + } + PUSH_U32((I32)res); + } +JIT_ADD_OVF_I32I32_end: + GO_NEXT(); + +JIT_ADD_OVF_UN_I32I32_start: + OPCODE_USE(JIT_ADD_OVF_UN_I32I32); + { + U32 v1, v2; + U64 res; + POP_U32_U32(v1, v2); + res = (U64)v1 + (U64)v2; + if (res > (U64)0xffffffff) { + // Overflowed, so throw exception + THROW(types[TYPE_SYSTEM_OVERFLOWEXCEPTION]); + } + PUSH_U32(res); + } +JIT_ADD_OVF_UN_I32I32_end: + GO_NEXT(); + +JIT_MUL_OVF_I32I32_start: + OPCODE_USE(JIT_MUL_OVF_I32I32); + { + U32 v1, v2; + I64 res; + POP_U32_U32(v1, v2); + res = (I64)(I32)v1 * (I64)(I32)v2; + if (res > (I64)0x7fffffff || res < (I64)0xffffffff80000000) { + // Overflowed, so throw exception + THROW(types[TYPE_SYSTEM_OVERFLOWEXCEPTION]); + } + PUSH_U32((I32)res); + } +JIT_MUL_OVF_I32I32_end: + GO_NEXT(); + +JIT_MUL_OVF_UN_I32I32_start: + OPCODE_USE(JIT_MUL_OVF_UN_I32I32); + { + U32 v1, v2; + U64 res; + POP_U32_U32(v1, v2); + res = (U64)v1 * (U64)v2; + if (res > (U64)0xffffffff) { + // Overflowed, so throw exception + THROW(types[TYPE_SYSTEM_OVERFLOWEXCEPTION]); + } + PUSH_U32(res); + } +JIT_MUL_OVF_UN_I32I32_end: + GO_NEXT(); + +JIT_SUB_OVF_I32I32_start: + OPCODE_USE(JIT_SUB_OVF_I32I32); + { + U32 v1, v2; + I64 res; + POP_U32_U32(v1, v2); + res = (I64)(I32)v1 - (I64)(I32)v2; + if (res > (I64)0x7fffffff || res < (I64)0xffffffff80000000) { + // Overflowed, so throw exception + THROW(types[TYPE_SYSTEM_OVERFLOWEXCEPTION]); + } + PUSH_U32((I32)res); + } +JIT_SUB_OVF_I32I32_end: + GO_NEXT(); + +JIT_SUB_OVF_UN_I32I32_start: + OPCODE_USE(JIT_SUB_OVF_UN_I32I32); + { + U32 v1, v2; + U64 res; + POP_U32_U32(v1, v2); + res = (U64)v1 - (U64)v2; + if (res > (U64)0xffffffff) { + // Overflowed, so throw exception + THROW(types[TYPE_SYSTEM_OVERFLOWEXCEPTION]); + } + PUSH_U32(res); + } +JIT_SUB_OVF_UN_I32I32_end: + GO_NEXT(); + +JIT_ADD_I32I32_start: + OPCODE_USE(JIT_ADD_I32I32); + BINARY_OP(I32, I32, I32, +); +JIT_ADD_I32I32_end: + GO_NEXT(); + +JIT_ADD_I64I64_start: + OPCODE_USE(JIT_ADD_I64I64); + BINARY_OP(I64, I64, I64, +); +JIT_ADD_I64I64_end: + GO_NEXT(); + +JIT_ADD_F32F32_start: + OPCODE_USE(JIT_ADD_F32F32); + BINARY_OP(float, float, float, +); +JIT_ADD_F32F32_end: + GO_NEXT(); + +JIT_ADD_F64F64_start: + OPCODE_USE(JIT_ADD_F64F64); + BINARY_OP(double, double, double, +); +JIT_ADD_F64F64_end: + GO_NEXT(); + +JIT_SUB_I32I32_start: + OPCODE_USE(JIT_SUB_I32I32); + BINARY_OP(I32, I32, I32, -); +JIT_SUB_I32I32_end: + GO_NEXT(); + +JIT_SUB_I64I64_start: + OPCODE_USE(JIT_SUB_I64I64); + BINARY_OP(I64, I64, I64, -); +JIT_SUB_I64I64_end: + GO_NEXT(); + +JIT_SUB_F32F32_start: + OPCODE_USE(JIT_SUB_F32F32); + BINARY_OP(double, double, double, -); +JIT_SUB_F32F32_end: + GO_NEXT(); + +JIT_SUB_F64F64_start: + OPCODE_USE(JIT_SUB_F64F64); + BINARY_OP(double, double, double, -); +JIT_SUB_F64F64_end: + GO_NEXT(); + +JIT_MUL_I32I32_start: + OPCODE_USE(JIT_MUL_I32I32); + BINARY_OP(I32, I32, I32, *); +JIT_MUL_I32I32_end: + GO_NEXT(); + +JIT_MUL_I64I64_start: + OPCODE_USE(JIT_MUL_I64I64); + BINARY_OP(I64, I64, I64, *); +JIT_MUL_I64I64_end: + GO_NEXT(); + +JIT_MUL_F32F32_start: + OPCODE_USE(JIT_MUL_F32F32); + BINARY_OP(float, float, float, *); +JIT_MUL_F32F32_end: + GO_NEXT(); + +JIT_MUL_F64F64_start: + OPCODE_USE(JIT_MUL_F64F64); + BINARY_OP(double, double, double, *); +JIT_MUL_F64F64_end: + GO_NEXT(); + +JIT_DIV_I32I32_start: + OPCODE_USE(JIT_DIV_I32I32); + BINARY_OP(I32, I32, I32, /); +JIT_DIV_I32I32_end: + GO_NEXT(); + +JIT_DIV_I64I64_start: + OPCODE_USE(JIT_DIV_I64I64); + BINARY_OP(I64, I64, I64, /); +JIT_DIV_I64I64_end: + GO_NEXT(); + +JIT_DIV_F32F32_start: + OPCODE_USE(JIT_DIV_F32F32); + BINARY_OP(float, float, float, /); +JIT_DIV_F32F32_end: + GO_NEXT(); + +JIT_DIV_F64F64_start: + OPCODE_USE(JIT_DIV_F64F64); + BINARY_OP(double, double, double, /); +JIT_DIV_F64F64_end: + GO_NEXT(); + +JIT_DIV_UN_I32I32_start: + OPCODE_USE(JIT_DIV_UN_I32I32); + BINARY_OP(U32, U32, U32, /); +JIT_DIV_UN_I32I32_end: + GO_NEXT(); + +JIT_DIV_UN_I64I64_start: + OPCODE_USE(JIT_DIV_UN_I64I64); + BINARY_OP(U64, U64, U64, /); +JIT_DIV_UN_I64I64_end: + GO_NEXT(); + +JIT_REM_I32I32_start: + OPCODE_USE(JIT_REM_I32I32); + BINARY_OP(I32, I32, I32, %); +JIT_REM_I32I32_end: + GO_NEXT(); + +JIT_REM_I64I64_start: + OPCODE_USE(JIT_REM_I64I64); + BINARY_OP(I64, I64, I64, %); +JIT_REM_I64I64_end: + GO_NEXT(); + +JIT_REM_UN_I32I32_start: + OPCODE_USE(JIT_REM_UN_I32I32); + BINARY_OP(U32, U32, U32, %); +JIT_REM_UN_I32I32_end: + GO_NEXT(); + +JIT_REM_UN_I64I64_start: + OPCODE_USE(JIT_REM_UN_I64I64); + BINARY_OP(U64, U64, U64, %); +JIT_REM_UN_I64I64_end: + GO_NEXT(); + +JIT_AND_I32I32_start: + OPCODE_USE(JIT_AND_I32I32); + BINARY_OP(U32, U32, U32, &); +JIT_AND_I32I32_end: + GO_NEXT(); + +JIT_AND_I64I64_start: + OPCODE_USE(JIT_AND_I64I64); + BINARY_OP(U64, U64, U64, &); +JIT_AND_I64I64_end: + GO_NEXT(); + +JIT_OR_I32I32_start: + OPCODE_USE(JIT_OR_I32I32); + BINARY_OP(U32, U32, U32, |); +JIT_OR_I32I32_end: + GO_NEXT(); + +JIT_OR_I64I64_start: + OPCODE_USE(JIT_OR_I64I64); + BINARY_OP(U64, U64, U64, |); +JIT_OR_I64I64_end: + GO_NEXT(); + +JIT_XOR_I32I32_start: + OPCODE_USE(JIT_XOR_I32I32); + BINARY_OP(U32, U32, U32, ^); +JIT_XOR_I32I32_end: + GO_NEXT(); + +JIT_XOR_I64I64_start: + OPCODE_USE(JIT_XOR_I64I64); + BINARY_OP(U64, U64, U64, ^); +JIT_XOR_I64I64_end: + GO_NEXT(); + +JIT_NEG_I32_start: + OPCODE_USE(JIT_NEG_I32); + UNARY_OP(I32, -); +JIT_NEG_I32_end: + GO_NEXT(); + +JIT_NEG_I64_start: + OPCODE_USE(JIT_NEG_I64); + UNARY_OP(I64, -); +JIT_NEG_I64_end: + GO_NEXT(); + +JIT_NOT_I32_start: + OPCODE_USE(JIT_NOT_I32); + UNARY_OP(U32, ~); +JIT_NOT_I32_end: + GO_NEXT(); + +JIT_NOT_I64_start: + OPCODE_USE(JIT_NOT_I64); + UNARY_OP(U64, ~); +JIT_NOT_I64_end: + GO_NEXT(); + +JIT_SHL_I32_start: + OPCODE_USE(JIT_SHL_I32); + BINARY_OP(U32, U32, U32, <<); +JIT_SHL_I32_end: + GO_NEXT(); + +JIT_SHR_I32_start: + OPCODE_USE(JIT_SHR_I32); + BINARY_OP(I32, I32, U32, >>); +JIT_SHR_I32_end: + GO_NEXT(); + +JIT_SHR_UN_I32_start: + OPCODE_USE(JIT_SHR_UN_I32); + BINARY_OP(U32, U32, U32, >>); +JIT_SHR_UN_I32_end: + GO_NEXT(); + +JIT_SHL_I64_start: + OPCODE_USE(JIT_SHL_I64); + BINARY_OP(U64, U64, U32, <<); +JIT_SHL_I64_end: + GO_NEXT(); + +JIT_SHR_I64_start: + OPCODE_USE(JIT_SHR_I64); + BINARY_OP(I64, I64, U32, >>); +JIT_SHR_I64_end: + GO_NEXT(); + +JIT_SHR_UN_I64_start: + OPCODE_USE(JIT_SHR_UN_I64); + BINARY_OP(U64, U64, U32, >>); +JIT_SHR_UN_I64_end: + GO_NEXT(); + + // Conversion operations + +JIT_CONV_U32_U32_start: +JIT_CONV_I32_U32_start: + OPCODE_USE(JIT_CONV_I32_U32); + { + U32 mask = GET_OP(); + STACK_ADDR(U32) &= mask; + } +JIT_CONV_U32_U32_end: +JIT_CONV_I32_U32_end: + GO_NEXT(); + +JIT_CONV_U32_I32_start: +JIT_CONV_I32_I32_start: + OPCODE_USE(JIT_CONV_I32_I32); + { + U32 shift = GET_OP(); + STACK_ADDR(I32) = (STACK_ADDR(I32) << shift) >> shift; + } +JIT_CONV_U32_I32_end: +JIT_CONV_I32_I32_end: + GO_NEXT(); + +JIT_CONV_I32_I64_start: + OPCODE_USE(JIT_CONV_I32_I64); + { + I32 value = (I32)POP_U32(); + PUSH_U64((I64)value); + } +JIT_CONV_I32_I64_end: + GO_NEXT(); + +JIT_CONV_I32_U64_start: +JIT_CONV_U32_U64_start: +JIT_CONV_U32_I64_start: + OPCODE_USE(JIT_CONV_U32_I64); + { + U32 value = POP_U32(); + PUSH_U64(value); + } +JIT_CONV_I32_U64_end: +JIT_CONV_U32_U64_end: +JIT_CONV_U32_I64_end: + GO_NEXT(); + +JIT_CONV_I32_R32_start: + OPCODE_USE(JIT_CONV_I32_R32); + { + I32 value = (I32)POP_U32(); + PUSH_FLOAT(value); + } +JIT_CONV_I32_R32_end: + GO_NEXT(); + +JIT_CONV_I32_R64_start: + OPCODE_USE(JIT_CONV_I32_R64); + { + I32 value = (I32)POP_U32(); + PUSH_DOUBLE(value); + } +JIT_CONV_I32_R64_end: + GO_NEXT(); + +JIT_CONV_U32_R32_start: + OPCODE_USE(JIT_CONV_U32_R32); + { + U32 value = POP_U32(); + PUSH_FLOAT(value); + } +JIT_CONV_U32_R32_end: + GO_NEXT(); + +JIT_CONV_U32_R64_start: + OPCODE_USE(JIT_CONV_U32_R64); + { + U32 value = POP_U32(); + PUSH_DOUBLE(value); + } +JIT_CONV_U32_R64_end: + GO_NEXT(); + +JIT_CONV_I64_U32_start: +JIT_CONV_U64_U32_start: + OPCODE_USE(JIT_CONV_I64_U32); + { + U32 mask = GET_OP(); + U64 value = POP_U64(); + PUSH_U32(value & mask); + } +JIT_CONV_I64_U32_end: +JIT_CONV_U64_U32_end: + GO_NEXT(); + +JIT_CONV_I64_I32_start: +JIT_CONV_U64_I32_start: + OPCODE_USE(JIT_CONV_I64_U32); + { + U32 shift = GET_OP(); + I32 value = (I32)POP_U64(); + value = (value << shift) >> shift; + PUSH_U32(value); + } +JIT_CONV_I64_I32_end: +JIT_CONV_U64_I32_end: + GO_NEXT(); + +JIT_CONV_I64_R32_start: + OPCODE_USE(JIT_CONV_I64_R32); + { + I64 value = (I64)POP_U64(); + PUSH_FLOAT(value); + } +JIT_CONV_I64_R32_end: + GO_NEXT(); + +JIT_CONV_I64_R64_start: + OPCODE_USE(JIT_CONV_I64_R64); + { + I64 value = (I64)POP_U64(); + PUSH_DOUBLE(value); + } +JIT_CONV_I64_R64_end: + GO_NEXT(); + +JIT_CONV_U64_R32_start: + OPCODE_USE(JIT_CONV_U64_R32); + { + U64 value = POP_U64(); + PUSH_FLOAT(value); + } +JIT_CONV_U64_R32_end: + GO_NEXT(); + +JIT_CONV_U64_R64_start: + OPCODE_USE(JIT_CONV_U64_R64); + { + U64 value = POP_U64(); + PUSH_DOUBLE(value); + } +JIT_CONV_U64_R64_end: + GO_NEXT(); + +JIT_CONV_R32_I32_start: + OPCODE_USE(JIT_CONV_R32_I32); + { + U32 shift = GET_OP(); + I32 result; + float value = POP_FLOAT(); + result = (I32)value; + result = (result << shift) >> shift; + PUSH_U32(result); + } +JIT_CONV_R32_I32_end: + GO_NEXT(); + +JIT_CONV_R32_U32_start: + OPCODE_USE(JIT_CONV_R32_U32); + { + U32 mask = GET_OP(); + float value = POP_FLOAT(); + PUSH_U32(((U32)value) & mask); + } +JIT_CONV_R32_U32_end: + GO_NEXT(); + +JIT_CONV_R32_I64_start: + OPCODE_USE(JIT_CONV_R32_I64); + { + float value = POP_FLOAT(); + PUSH_U64((I64)value); + } +JIT_CONV_R32_I64_end: + GO_NEXT(); + +JIT_CONV_R32_U64_start: + OPCODE_USE(JIT_CONV_R32_U64); + { + float value = POP_FLOAT(); + PUSH_U64(value); + } +JIT_CONV_R32_U64_end: + GO_NEXT(); + +JIT_CONV_R32_R64_start: + OPCODE_USE(JIT_CONV_R32_R64); + { + float value = POP_FLOAT(); + PUSH_DOUBLE(value); + } +JIT_CONV_R32_R64_end: + GO_NEXT(); + +JIT_CONV_R64_I32_start: + OPCODE_USE(JIT_CONV_R64_I32); + { + U32 shift = GET_OP(); + I32 result; + double value = POP_DOUBLE(); + result = (I32)value; + result = (result << shift) >> shift; + PUSH_U32(result); + } +JIT_CONV_R64_I32_end: + GO_NEXT(); + +JIT_CONV_R64_U32_start: + OPCODE_USE(JIT_CONV_R64_U32); + { + U32 mask = GET_OP(); + double value = POP_DOUBLE(); + PUSH_U32(((U32)value) & mask); + } +JIT_CONV_R64_U32_end: + GO_NEXT(); + +JIT_CONV_R64_I64_start: + OPCODE_USE(JIT_CONV_R64_I64); + { + float value = POP_FLOAT(); + PUSH_U64((I64)value); + } +JIT_CONV_R64_I64_end: + GO_NEXT(); + +JIT_CONV_R64_U64_start: + OPCODE_USE(JIT_CONV_R64_U64); + { + double value = POP_DOUBLE(); + PUSH_U64(value); + } +JIT_CONV_R64_U64_end: + GO_NEXT(); + +JIT_CONV_R64_R32_start: + OPCODE_USE(JIT_CONV_R64_R32); + { + float value = (float)POP_DOUBLE(); + PUSH_FLOAT(value); + } +JIT_CONV_R64_R32_end: + GO_NEXT(); + +JIT_LOADFUNCTION_start: + OPCODE_USE(JIT_LOADFUNCTION); + { + // This is actually a pointer not a U32 + U32 value = GET_OP(); + PUSH_U32(value); + } +JIT_LOADFUNCTION_end: + GO_NEXT(); + +JIT_LOADOBJECT_start: + OPCODE_USE(JIT_LOADOBJECT); + { + tMD_TypeDef *pTypeDef; + PTR pMem; + + pMem = POP_PTR(); // address of value-type + pTypeDef = (tMD_TypeDef*)GET_OP(); //type of the value-type + //if (pTypeDef->stackSize != pTypeDef->arrayElementSize) { + // For bytes and int16s we need some special code to ensure that the stack + // does not contain rubbish in the bits unused in this type. + // But there is no harm in running this for all types, and it's smaller and probably faster + *(U32*)pCurEvalStack = 0; + //} + PUSH_VALUETYPE(pMem, pTypeDef->arrayElementSize, pTypeDef->stackSize); + } +JIT_LOADOBJECT_end: + GO_NEXT(); + +JIT_LOAD_STRING_start: + OPCODE_USE(JIT_LOAD_STRING); + { + U32 value = GET_OP(); + PTR heapPtr = SystemString_FromUserStrings(pCurrentMethodState->pMetaData, value); + PUSH_O(heapPtr); + } +JIT_LOAD_STRING_end: + GO_NEXT(); + +JIT_NEWOBJECT_start: + OPCODE_USE(JIT_NEWOBJECT); + { + tMD_MethodDef *pConstructorDef; + HEAP_PTR obj; + tMethodState *pCallMethodState; + U32 isInternalConstructor; + PTR pTempPtr; + + pConstructorDef = (tMD_MethodDef*)GET_OP(); + isInternalConstructor = (pConstructorDef->implFlags & METHODIMPLATTRIBUTES_INTERNALCALL) != 0; + + if (!isInternalConstructor) { + // All internal constructors MUST allocate their own 'this' objects + obj = Heap_AllocType(pConstructorDef->pParentType); + } else { + // Need to set this to something non-NULL so that CreateParameters() works properly + obj = (HEAP_PTR)-1; + } + + // Set up the new method state for the called method + pCallMethodState = MethodState_Direct(pThread, pConstructorDef, pCurrentMethodState, isInternalConstructor); + // Fill in the parameters + pTempPtr = pCurEvalStack; + CreateParameters(pCallMethodState->pParamsLocals, pConstructorDef, &pTempPtr, obj); + pCurEvalStack = pTempPtr; + if (!isInternalConstructor) { + // Push the object here, so it's on the stack when the constructor returns + PUSH_O(obj); + } + // Set up the local variables for the new method state (for the obj constructor) + CHANGE_METHOD_STATE(pCallMethodState); + // Run any pending Finalizers + RUN_FINALIZER(); + } +JIT_NEWOBJECT_end: + GO_NEXT_CHECK(); + +JIT_NEWOBJECT_VALUETYPE_start: + OPCODE_USE(JIT_NEWOBJECT_VALUETYPE); + { + tMD_MethodDef *pConstructorDef; + tMethodState *pCallMethodState; + U32 isInternalConstructor; + PTR pTempPtr, pMem; + + pConstructorDef = (tMD_MethodDef*)GET_OP(); + isInternalConstructor = (pConstructorDef->implFlags & METHODIMPLATTRIBUTES_INTERNALCALL) != 0; + + // Allocate space on the eval-stack for the new value-type here + pMem = pCurEvalStack - (pConstructorDef->parameterStackSize - sizeof(PTR)); + + // Set up the new method state for the called method + pCallMethodState = MethodState_Direct(pThread, pConstructorDef, pCurrentMethodState, isInternalConstructor); + // Fill in the parameters + pTempPtr = pCurEvalStack; + CreateParameters(pCallMethodState->pParamsLocals, pConstructorDef, &pTempPtr, pMem); + pCurEvalStack = pTempPtr; + // Set the stack state so it's correct for the constructor return + pCurEvalStack += pConstructorDef->pParentType->stackSize; + // Set up the local variables for the new method state + CHANGE_METHOD_STATE(pCallMethodState); + // Run any pending Finalizers + RUN_FINALIZER(); + } +JIT_NEWOBJECT_VALUETYPE_end: + GO_NEXT_CHECK(); + +JIT_IS_INSTANCE_start: + op = JIT_IS_INSTANCE; + goto jitCastClass; +JIT_CAST_CLASS_start: + op = JIT_CAST_CLASS; +jitCastClass: + OPCODE_USE(JIT_CAST_CLASS); + { + tMD_TypeDef *pToType, *pTestType; + HEAP_PTR heapPtr; + + pToType = (tMD_TypeDef*)GET_OP(); + heapPtr = POP_O(); + if (heapPtr == NULL) { + PUSH_O(NULL); + goto JIT_IS_INSTANCE_end; + } + pTestType = Heap_GetType(heapPtr); + if (TYPE_ISARRAY(pTestType) && TYPE_ISARRAY(pToType)) { + // Arrays are handled specially - check if the element type is compatible + if (Type_IsAssignableFrom(pToType->pArrayElementType, pTestType->pArrayElementType)) { + PUSH_O(heapPtr); + goto JIT_IS_INSTANCE_end; + } + } else { + if (Type_IsAssignableFrom(pToType, pTestType) || + (pToType->pGenericDefinition == types[TYPE_SYSTEM_NULLABLE] && + pToType->ppClassTypeArgs[0] == pTestType)) { + // If derived class, interface, or nullable type compatible. + PUSH_O(heapPtr); + goto JIT_IS_INSTANCE_end; + } + } + if (op == JIT_IS_INSTANCE) { + PUSH_O(NULL); + } else { + THROW(types[TYPE_SYSTEM_INVALIDCASTEXCEPTION]); + } + } +JIT_IS_INSTANCE_end: +JIT_CAST_CLASS_end: + GO_NEXT(); + +JIT_NEW_VECTOR_start: // Array with 1 dimension, zero-based + OPCODE_USE(JIT_NEW_VECTOR); + { + tMD_TypeDef *pArrayTypeDef; + U32 numElements; + HEAP_PTR heapPtr; + + pArrayTypeDef = (tMD_TypeDef*)GET_OP(); + numElements = POP_U32(); + heapPtr = SystemArray_NewVector(pArrayTypeDef, numElements); + PUSH_O(heapPtr); + // Run any pending Finalizers + RUN_FINALIZER(); + } +JIT_NEW_VECTOR_end: + GO_NEXT(); + +JIT_LOAD_VECTOR_LEN_start: // Load the length of a vector array + OPCODE_USE(JIT_LOAD_VECTOR_LEN); + { + PTR heapPtr = POP_O(); + U32 value = SystemArray_GetLength(heapPtr); + PUSH_U32(value); + } +JIT_LOAD_VECTOR_LEN_end: + GO_NEXT(); + +JIT_LOAD_ELEMENT_I8_start: + OPCODE_USE(JIT_LOAD_ELEMENT_I8); + { + U32 value, idx = POP_U32(); // Array index + HEAP_PTR heapPtr = POP_O(); + SystemArray_LoadElement(heapPtr, idx, (PTR)&value); + PUSH_U32((I8)value); + } +JIT_LOAD_ELEMENT_I8_end: + GO_NEXT(); + +JIT_LOAD_ELEMENT_U8_start: + OPCODE_USE(JIT_LOAD_ELEMENT_U8); + { + U32 value, idx = POP_U32(); // Array index + HEAP_PTR heapPtr = POP_O(); + SystemArray_LoadElement(heapPtr, idx, (PTR)&value); + PUSH_U32((U8)value); + } +JIT_LOAD_ELEMENT_U8_end: + GO_NEXT(); + +JIT_LOAD_ELEMENT_I16_start: + OPCODE_USE(JIT_LOAD_ELEMENT_I16); + { + U32 value, idx = POP_U32(); // Array index + HEAP_PTR heapPtr = POP_O(); + SystemArray_LoadElement(heapPtr, idx, (PTR)&value); + PUSH_U32((I16)value); + } +JIT_LOAD_ELEMENT_I16_end: + GO_NEXT(); + +JIT_LOAD_ELEMENT_U16_start: + OPCODE_USE(JIT_LOAD_ELEMENT_U16); + { + U32 value, idx = POP_U32(); // Array index + HEAP_PTR heapPtr = POP_O(); + SystemArray_LoadElement(heapPtr, idx, (PTR)&value); + PUSH_U32((U16)value); + } +JIT_LOAD_ELEMENT_U16_end: + GO_NEXT(); + +JIT_LOAD_ELEMENT_I32_start: +JIT_LOAD_ELEMENT_U32_start: +JIT_LOAD_ELEMENT_R32_start: + OPCODE_USE(JIT_LOAD_ELEMENT_I32); + { + U32 value, idx = POP_U32(); // Array index + HEAP_PTR heapPtr = POP_O(); + SystemArray_LoadElement(heapPtr, idx, (PTR)&value); + PUSH_U32(value); + } +JIT_LOAD_ELEMENT_I32_end: +JIT_LOAD_ELEMENT_U32_end: +JIT_LOAD_ELEMENT_R32_end: + GO_NEXT(); + +JIT_LOAD_ELEMENT_I64_start: +JIT_LOAD_ELEMENT_R64_start: + OPCODE_USE(JIT_LOAD_ELEMENT_I64); + { + U32 idx = POP_U32(); // array index + HEAP_PTR heapPtr = POP_O(); + U64 value; + SystemArray_LoadElement(heapPtr, idx, (PTR)&value); + PUSH_U64(value); + } +JIT_LOAD_ELEMENT_I64_end: +JIT_LOAD_ELEMENT_R64_end: + GO_NEXT(); + +JIT_LOAD_ELEMENT_start: + OPCODE_USE(JIT_LOAD_ELEMENT); + { + U32 idx = POP_U32(); // Array index + HEAP_PTR heapPtr = POP_O(); // array object + U32 size = GET_OP(); // size of type on stack + *(U32*)pCurEvalStack = 0; // This is required to zero out the stack for types that are stored in <4 bytes in arrays + SystemArray_LoadElement(heapPtr, idx, pCurEvalStack); + pCurEvalStack += size; + } +JIT_LOAD_ELEMENT_end: + GO_NEXT(); + +JIT_LOAD_ELEMENT_ADDR_start: + OPCODE_USE(JIT_LOAD_ELEMENT_ADDR); + { + U32 idx = POP_U32(); // Array index + PTR heapPtr = POP_O(); + PTR pMem = SystemArray_LoadElementAddress(heapPtr, idx); + PUSH_PTR(pMem); + } +JIT_LOAD_ELEMENT_ADDR_end: + GO_NEXT(); + +JIT_STORE_ELEMENT_32_start: + OPCODE_USE(JIT_STORE_ELEMENT_32); + { + U32 value = POP_U32(); // Value + U32 idx = POP_U32(); // Array index + PTR heapPtr = POP_O(); + SystemArray_StoreElement(heapPtr, idx, (PTR)&value); + } +JIT_STORE_ELEMENT_32_end: + GO_NEXT(); + +JIT_STORE_ELEMENT_64_start: + OPCODE_USE(JIT_STORE_ELEMENT_64); + { + U64 value = POP_U64(); // Value + U32 idx = POP_U32(); // Array index + PTR heapPtr = POP_O(); + SystemArray_StoreElement(heapPtr, idx, (PTR)&value); + } +JIT_STORE_ELEMENT_64_end: + GO_NEXT(); + +JIT_STORE_ELEMENT_start: + OPCODE_USE(JIT_STORE_ELEMENT); + { + HEAP_PTR heapPtr; + PTR pMem; + U32 idx, size = GET_OP(); // Size in bytes of value on stack + POP(size); + pMem = pCurEvalStack; + idx = POP_U32(); // Array index + heapPtr = POP_O(); // Array on heap + SystemArray_StoreElement(heapPtr, idx, pMem); + } +JIT_STORE_ELEMENT_end: + GO_NEXT(); + +JIT_STOREFIELD_INT32_start: +JIT_STOREFIELD_O_start: +JIT_STOREFIELD_INTNATIVE_start: // only for 32-bit +JIT_STOREFIELD_PTR_start: // only for 32-bit +JIT_STOREFIELD_F32_start: + OPCODE_USE(JIT_STOREFIELD_INT32); + { + tMD_FieldDef *pFieldDef; + PTR pMem; + U32 value; + HEAP_PTR heapPtr; + + pFieldDef = (tMD_FieldDef*)GET_OP(); + value = POP_U32(); + heapPtr = POP_O(); + pMem = heapPtr + pFieldDef->memOffset; + *(U32*)pMem = value; + } +JIT_STOREFIELD_INT32_end: +JIT_STOREFIELD_O_end: +JIT_STOREFIELD_INTNATIVE_end: +JIT_STOREFIELD_PTR_end: +JIT_STOREFIELD_F32_end: + GO_NEXT(); + +JIT_STOREFIELD_INT64_start: +JIT_STOREFIELD_F64_start: + OPCODE_USE(JIT_STOREFIELD_F64); + { + tMD_FieldDef *pFieldDef; + PTR pMem; + U64 value; + HEAP_PTR heapPtr; + + pFieldDef = (tMD_FieldDef*)GET_OP(); + value = POP_U64(); + heapPtr = POP_O(); + pMem = heapPtr + pFieldDef->memOffset; + *(U64*)pMem = value; + } +JIT_STOREFIELD_INT64_end: +JIT_STOREFIELD_F64_end: + GO_NEXT(); + +JIT_STOREFIELD_VALUETYPE_start: + OPCODE_USE(JIT_STOREFIELD_VALUETYPE); + { + tMD_FieldDef *pFieldDef; + PTR pMem; + + pFieldDef = (tMD_FieldDef*)GET_OP(); + pCurEvalStack -= pFieldDef->memSize; + pMem = pCurEvalStack; + heapPtr = POP_O(); + memcpy(heapPtr + pFieldDef->memOffset, pMem, pFieldDef->memSize); + } +JIT_STOREFIELD_VALUETYPE_end: + GO_NEXT(); + +JIT_LOADFIELD_start: + OPCODE_USE(JIT_LOADFIELD); + // TODO: Optimize into LOADFIELD of different types O, INT32, INT64, F, etc...) + { + tMD_FieldDef *pFieldDef; + + pFieldDef = (tMD_FieldDef*)GET_OP(); + heapPtr = POP_O(); + pMem = heapPtr + pFieldDef->memOffset; + // It may not be a value-type, but this'll work anyway + PUSH_VALUETYPE(pMem, pFieldDef->memSize, pFieldDef->memSize); + } +JIT_LOADFIELD_end: + GO_NEXT(); + +JIT_LOADFIELD_4_start: + OPCODE_USE(JIT_LOADFIELD_4); + { + U32 ofs = GET_OP(); + PTR heapPtr = POP_O(); + PUSH_U32(*(U32*)(heapPtr + ofs)); + } +JIT_LOADFIELD_4_end: + GO_NEXT(); + +JIT_LOADFIELD_VALUETYPE_start: + OPCODE_USE(JIT_LOADFIELD_VALUETYPE); + { + tMD_FieldDef *pFieldDef; + + u32Value = GET_OP(); // Get the size of the value-type on the eval stack + pFieldDef = (tMD_FieldDef*)GET_OP(); + pCurrentMethodState->stackOfs -= u32Value; + //pMem = pEvalStack + pCurrentMethodState->stackOfs + pFieldDef->memOffset; + pMem = pCurEvalStack + pFieldDef->memOffset; + // It may not be a value-type, but this'll work anyway + PUSH_VALUETYPE(pMem, pFieldDef->memSize, pFieldDef->memSize); + } +JIT_LOADFIELD_VALUETYPE_end: + GO_NEXT(); + +JIT_LOAD_FIELD_ADDR_start: + OPCODE_USE(JIT_LOAD_FIELD_ADDR); + { + U32 ofs = GET_OP(); + HEAP_PTR heapPtr = POP_O(); + PTR pMem = heapPtr + ofs; + PUSH_PTR(pMem); + } +JIT_LOAD_FIELD_ADDR_end: + GO_NEXT(); + +JIT_STORESTATICFIELD_INT32_start: +JIT_STORESTATICFIELD_F32_start: +JIT_STORESTATICFIELD_O_start: // only for 32-bit +JIT_STORESTATICFIELD_INTNATIVE_start: // only for 32-bit +JIT_STORESTATICFIELD_PTR_start: // only for 32-bit + OPCODE_USE(JIT_STORESTATICFIELD_INT32); + { + tMD_FieldDef *pFieldDef; + PTR pMem; + U32 value; + + pFieldDef = (tMD_FieldDef*)GET_OP(); + value = POP_U32(); + pMem = pFieldDef->pMemory; + *(U32*)pMem = value; + } +JIT_STORESTATICFIELD_INT32_end: +JIT_STORESTATICFIELD_F32_end: +JIT_STORESTATICFIELD_O_end: +JIT_STORESTATICFIELD_INTNATIVE_end: +JIT_STORESTATICFIELD_PTR_end: + GO_NEXT(); + +JIT_STORESTATICFIELD_F64_start: +JIT_STORESTATICFIELD_INT64_start: + OPCODE_USE(JIT_STORESTATICFIELD_INT64); + { + tMD_FieldDef *pFieldDef; + PTR pMem; + U64 value; + + pFieldDef = (tMD_FieldDef*)GET_OP(); + value = POP_U64(); + //pMem = pFieldDef->pParentType->pStaticFields + pFieldDef->memOffset; + pMem = pFieldDef->pMemory; + *(U64*)pMem = value; + } +JIT_STORESTATICFIELD_F64_end: +JIT_STORESTATICFIELD_INT64_end: + GO_NEXT(); + +JIT_STORESTATICFIELD_VALUETYPE_start: + OPCODE_USE(JIT_STORESTATICFIELD_VALUETYPE); + { + tMD_FieldDef *pFieldDef; + PTR pMem; + + pFieldDef = (tMD_FieldDef*)GET_OP(); + pMem = pFieldDef->pMemory; + POP_VALUETYPE(pMem, pFieldDef->memSize, pFieldDef->memSize); + } +JIT_STORESTATICFIELD_VALUETYPE_end: + GO_NEXT(); + +JIT_LOADSTATICFIELDADDRESS_CHECKTYPEINIT_start: + op = JIT_LOADSTATICFIELDADDRESS_CHECKTYPEINIT; + goto loadStaticFieldStart; +JIT_LOADSTATICFIELD_CHECKTYPEINIT_VALUETYPE_start: + op = JIT_LOADSTATICFIELD_CHECKTYPEINIT_VALUETYPE; + goto loadStaticFieldStart; +JIT_LOADSTATICFIELD_CHECKTYPEINIT_F64_start: + op = JIT_LOADSTATICFIELD_CHECKTYPEINIT_F64; + goto loadStaticFieldStart; +JIT_LOADSTATICFIELD_CHECKTYPEINIT_INT32_start: +JIT_LOADSTATICFIELD_CHECKTYPEINIT_F32_start: +JIT_LOADSTATICFIELD_CHECKTYPEINIT_O_start: // Only for 32-bit +JIT_LOADSTATICFIELD_CHECKTYPEINIT_INTNATIVE_start: // Only for 32-bit +JIT_LOADSTATICFIELD_CHECKTYPEINIT_PTR_start: // Only for 32-bit + op = 0; +loadStaticFieldStart: + OPCODE_USE(JIT_LOADSTATICFIELD_CHECKTYPEINIT_INT32); + { + tMD_FieldDef *pFieldDef; + tMD_TypeDef *pParentType; + + pFieldDef = (tMD_FieldDef*)GET_OP(); + pParentType = pFieldDef->pParentType; + // Check that any type (static) constructor has been called + if (pParentType->isTypeInitialised == 0) { + // Set the state to initialised + pParentType->isTypeInitialised = 1; + // Initialise the type (if there is a static constructor) + if (pParentType->pStaticConstructor != NULL) { + tMethodState *pCallMethodState; + + // Call static constructor + // Need to re-run this instruction when we return from static constructor call + //pCurrentMethodState->ipOffset -= 2; + pCurOp -= 2; + pCallMethodState = MethodState_Direct(pThread, pParentType->pStaticConstructor, pCurrentMethodState, 0); + // There can be no parameters, so don't need to set them up + CHANGE_METHOD_STATE(pCallMethodState); + GO_NEXT_CHECK(); + } + } + if (op == JIT_LOADSTATICFIELD_CHECKTYPEINIT_F64) { + U64 value; + value = *(U64*)(pFieldDef->pMemory); + PUSH_U64(value); + } else if (op == JIT_LOADSTATICFIELD_CHECKTYPEINIT_VALUETYPE) { + PUSH_VALUETYPE(pFieldDef->pMemory, pFieldDef->memSize, pFieldDef->memSize); + } else { + U32 value; + if (op == JIT_LOADSTATICFIELDADDRESS_CHECKTYPEINIT) { + value = (U32)(pFieldDef->pMemory); + } else { + value = *(U32*)pFieldDef->pMemory; + } + PUSH_U32(value); + } + } +JIT_LOADSTATICFIELDADDRESS_CHECKTYPEINIT_end: +JIT_LOADSTATICFIELD_CHECKTYPEINIT_VALUETYPE_end: +JIT_LOADSTATICFIELD_CHECKTYPEINIT_INT32_end: +JIT_LOADSTATICFIELD_CHECKTYPEINIT_F32_end: +JIT_LOADSTATICFIELD_CHECKTYPEINIT_F64_end: +JIT_LOADSTATICFIELD_CHECKTYPEINIT_O_end: +JIT_LOADSTATICFIELD_CHECKTYPEINIT_INTNATIVE_end: +JIT_LOADSTATICFIELD_CHECKTYPEINIT_PTR_end: + GO_NEXT(); + +JIT_INIT_VALUETYPE_start: + OPCODE_USE(JIT_INIT_VALUETYPE); + { + tMD_TypeDef *pTypeDef; + + pTypeDef = (tMD_TypeDef*)GET_OP(); + pMem = POP_PTR(); + memset(pMem, 0, pTypeDef->instanceMemSize); + } +JIT_INIT_VALUETYPE_end: + GO_NEXT(); + +JIT_INIT_OBJECT_start: + OPCODE_USE(JIT_INIT_OBJECT); + { + PTR pMem = POP_PTR(); + *(void**)pMem = NULL; + } +JIT_INIT_OBJECT_end: + GO_NEXT(); + +JIT_BOX_INT32_start: +JIT_BOX_F32_start: +JIT_BOX_INTNATIVE_start: + OPCODE_USE(JIT_BOX_INT32); + { + tMD_TypeDef *pTypeDef; + + pTypeDef = (tMD_TypeDef*)GET_OP(); + heapPtr = Heap_AllocType(pTypeDef); + u32Value = POP_U32(); + *(U32*)heapPtr = u32Value; + PUSH_O(heapPtr); + } +JIT_BOX_INT32_end: +JIT_BOX_F32_end: +JIT_BOX_INTNATIVE_end: + GO_NEXT(); + +JIT_BOX_INT64_start: +JIT_BOX_F64_start: +OPCODE_USE(JIT_BOX_INT64); + { + tMD_TypeDef *pTypeDef = (tMD_TypeDef*)GET_OP(); + heapPtr = Heap_AllocType(pTypeDef); + *(U64*)heapPtr = POP_U64(); + PUSH_O(heapPtr); + } +JIT_BOX_INT64_end: +JIT_BOX_F64_end: + GO_NEXT(); + +JIT_BOX_VALUETYPE_start: + OPCODE_USE(JIT_BOX_VALUETYPE); + { + tMD_TypeDef *pTypeDef; + + pTypeDef = (tMD_TypeDef*)GET_OP(); + heapPtr = Heap_AllocType(pTypeDef); + POP_VALUETYPE(heapPtr, pTypeDef->stackSize, pTypeDef->stackSize); + PUSH_O(heapPtr); + } +JIT_BOX_VALUETYPE_end: + GO_NEXT(); + +JIT_BOX_O_start: + pCurOp++; + // Fall-through +JIT_UNBOX2OBJECT_start: // TODO: This is not correct - it should check the type, just like CAST_CLASS + OPCODE_USE(JIT_UNBOX2OBJECT); + // Nothing to do +JIT_BOX_O_end: +JIT_UNBOX2OBJECT_end: + GO_NEXT(); + +JIT_BOX_NULLABLE_start: + OPCODE_USE(JIT_BOX_NULLABLE); + { + // Get the underlying type of the nullable type + tMD_TypeDef *pType = (tMD_TypeDef*)GET_OP(); + + // Take the nullable type off the stack. The +4 is because the of the HasValue field (Bool, size = 4 bytes) + pCurEvalStack -= pType->stackSize + 4; + // If .HasValue + if (*(U32*)pCurEvalStack) { + // Box the underlying type + HEAP_PTR boxed; + boxed = Heap_Box(pType, pCurEvalStack + 4); + PUSH_O(boxed); + } else { + // Put a NULL pointer on the stack + PUSH_O(NULL); + } + } +JIT_BOX_NULLABLE_end: + GO_NEXT(); + +JIT_UNBOX2VALUETYPE_start: + OPCODE_USE(JIT_UNBOX2VALUETYPE); + { + tMD_TypeDef *pTypeDef; + HEAP_PTR heapPtr; + + heapPtr = POP_O(); + pTypeDef = Heap_GetType(heapPtr); + PUSH_VALUETYPE(heapPtr, pTypeDef->stackSize, pTypeDef->stackSize); + } +JIT_UNBOX2VALUETYPE_end: + GO_NEXT(); + +JIT_UNBOX_NULLABLE_start: + OPCODE_USE(JIT_UNBOX_NULLABLE); + { + tMD_TypeDef *pTypeDef = (tMD_TypeDef*)GET_OP(); + HEAP_PTR heapPtr; + heapPtr = POP_O(); + if (heapPtr == NULL) { + // Push .HasValue (= false) + PUSH_U32(0); + // And increase the stack pointer by the size of the underlying type + // (the contents don't matter) + pCurEvalStack += pTypeDef->stackSize; + } else { + // Push .HasValue (= true) + PUSH_U32(1); + // Push the contents of .Value + PUSH_VALUETYPE(heapPtr, pTypeDef->stackSize, pTypeDef->stackSize); + } + } +JIT_UNBOX_NULLABLE_end: + GO_NEXT(); + +JIT_LOADTOKEN_TYPE_start: + OPCODE_USE(JIT_LOADTOKEN_TYPE); + { + tMD_TypeDef *pTypeDef; + + pTypeDef = (tMD_TypeDef*)GET_OP(); + // Push new valuetype onto evaluation stack + PUSH_PTR((PTR)pTypeDef); + } +JIT_LOADTOKEN_TYPE_end: + GO_NEXT(); + +JIT_LOADTOKEN_FIELD_start: + OPCODE_USE(JIT_LOADTOKEN_FIELD); + { + tMD_FieldDef *pFieldDef; + + pFieldDef = (tMD_FieldDef*)GET_OP(); + // Push new valuetype onto evaluation stack - only works on static fields. + PUSH_PTR(pFieldDef->pMemory); + } +JIT_LOADTOKEN_FIELD_end: + GO_NEXT(); + +JIT_RETHROW_start: + op = JIT_RETHROW; + goto throwStart; +JIT_THROW_start: + op = JIT_THROW; +throwStart: + OPCODE_USE(JIT_THROW); + { + U32 i; + tExceptionHeader *pCatch; + tMethodState *pCatchMethodState; + tMD_TypeDef *pExType; + + // Get the exception object + if (op == JIT_RETHROW) { + heapPtr = pThread->pCurrentExceptionObject; + } else { + heapPtr = POP_O(); +throwHeapPtr: + pThread->pCurrentExceptionObject = heapPtr; + } + SAVE_METHOD_STATE(); + pExType = Heap_GetType(heapPtr); + // Find any catch exception clauses; look in the complete call stack + pCatch = NULL; + pCatchMethodState = pCurrentMethodState; + for(;;) { + for (i=0; ipMethod->pJITted->numExceptionHandlers; i++) { + tExceptionHeader *pEx = &pCatchMethodState->pMethod->pJITted->pExceptionHeaders[i]; + if (pEx->flags == COR_ILEXCEPTION_CLAUSE_EXCEPTION && + pCatchMethodState->ipOffset - 1 >= pEx->tryStart && + pCatchMethodState->ipOffset - 1 < pEx->tryEnd && + Type_IsDerivedFromOrSame(pEx->u.pCatchTypeDef, pExType)) { + + // Found the correct catch clause to jump to + pCatch = pEx; + break; + } + } + if (pCatch != NULL) { + // Found a suitable exception handler + break; + } + pCatchMethodState = pCatchMethodState->pCaller; + if (pCatchMethodState == NULL) { + Crash("Unhandled exception in %s.%s(): %s.%s", + pCurrentMethodState->pMethod->pParentType->name, + pCurrentMethodState->pMethod->name, pExType->nameSpace, pExType->name); + } + } + // Unwind the stack down to the exception handler's stack frame (MethodState) + // Run all finally clauses during unwinding + pThread->pCatchMethodState = pCatchMethodState; + pThread->pCatchExceptionHandler = pCatch; + // Have to use the pThread->pCatchMethodState, as we could be getting here from END_FINALLY + while (pCurrentMethodState != pThread->pCatchMethodState) { + tMethodState *pPrevState; + +finallyUnwindStack: + for (i=pThread->nextFinallyUnwindStack; ipMethod->pJITted->numExceptionHandlers; i++) { + tExceptionHeader *pEx; + + pEx = &pCurrentMethodState->pMethod->pJITted->pExceptionHeaders[i]; + if (pEx->flags == COR_ILEXCEPTION_CLAUSE_FINALLY && + pCurrentMethodState->ipOffset - 1 >= pEx->tryStart && + pCurrentMethodState->ipOffset - 1 < pEx->tryEnd) { + + // Found a finally handler + POP_ALL(); + CHANGE_METHOD_STATE(pCurrentMethodState); + pCurrentMethodState->ipOffset = pEx->handlerStart; + // Keep track of which finally clause should be executed next + pThread->nextFinallyUnwindStack = i + 1; + goto throwEnd; + } + } + + pPrevState = pCurrentMethodState->pCaller; + MethodState_Delete(pThread, &pCurrentMethodState); + pCurrentMethodState = pPrevState; + // Reset the stack unwind tracker + pThread->nextFinallyUnwindStack = 0; + } + // Set the IP to the catch handler + pCurrentMethodState->ipOffset = pThread->pCatchExceptionHandler->handlerStart; + // Set the current method state + LOAD_METHOD_STATE(); + // Push onto this stack-frame's evaluation stack the opject thrown + POP_ALL(); + PUSH_O(pThread->pCurrentExceptionObject); + } +throwEnd: +JIT_THROW_end: +JIT_RETHROW_end: + GO_NEXT_CHECK(); + +JIT_LEAVE_start: + OPCODE_USE(JIT_LEAVE); + { + U32 i; + tExceptionHeader *pFinally; + + // Find any finally exception clauses + pFinally = NULL; + for (i=0; inumExceptionHandlers; i++) { + if (pJIT->pExceptionHeaders[i].flags == COR_ILEXCEPTION_CLAUSE_FINALLY && + pCurrentMethodState->ipOffset - 1 >= pJIT->pExceptionHeaders[i].tryStart && + pCurrentMethodState->ipOffset - 1 < pJIT->pExceptionHeaders[i].tryEnd) { + // Found the correct finally clause to jump to + pFinally = &pJIT->pExceptionHeaders[i]; + break; + } + } + POP_ALL(); + ofs = GET_OP(); + if (pFinally != NULL) { + // Jump to 'finally' section + pCurOp = pOps + pFinally->handlerStart; + pCurrentMethodState->pOpEndFinally = pOps + ofs; + } else { + // just branch + pCurOp = pOps + ofs; + } + } +JIT_LEAVE_end: + GO_NEXT_CHECK(); + +JIT_END_FINALLY_start: + OPCODE_USE(JIT_END_FINALLY); + if (pThread->nextFinallyUnwindStack > 0) { + // unwinding stack, so jump back to unwind code + goto finallyUnwindStack; + } else { + // Just empty the evaluation stack and continue on to the next opcode + // (finally blocks are always after catch blocks, so execution can just continue) + POP_ALL(); + // And jump to the correct instruction, as specified in the leave instruction + pCurOp = pCurrentMethodState->pOpEndFinally; + } +JIT_END_FINALLY_end: + GO_NEXT_CHECK(); + +done: + SAVE_METHOD_STATE(); + + return THREAD_STATUS_RUNNING; +} + +void JIT_Execute_Init() { + // Initialise the JIT code addresses + JIT_Execute(NULL, 0); +} \ No newline at end of file diff --git a/dna/JIT_OpCodes.h b/dna/JIT_OpCodes.h new file mode 100644 index 0000000..0c8dc91 --- /dev/null +++ b/dna/JIT_OpCodes.h @@ -0,0 +1,452 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__JIT_OPCODES_H) +#define __JIT_OPCODES_H + +#include "EvalStack.h" + +// JIT opcodes may be up to 9 bits long +#define JIT_OPCODE_MAXBITS 9 +#define JIT_OPCODE_MAXNUM (1 << JIT_OPCODE_MAXBITS) +//#define JIT_OPCODE_MASK ((1 << JIT_OPCODE_MAXBITS) - 1) +//#define JIT_OPCODE(opCode) ((opCode) & JIT_OPCODE_MASK) +//#define JIT_PARAM(opCode) ((opCode) >> JIT_OPCODE_MAXBITS) + +// Note that the exact order of some of these op-codes matters. +// This is due to optimisations where groups of opcodes can be handled together + +#define JIT_NOP 0x0 +#define JIT_RETURN 0x1 +#define JIT_LOAD_I32 0x2 +#define JIT_BRANCH 0x3 +#define JIT_LOAD_STRING 0x4 +#define JIT_CALLVIRT_O 0x5 +#define JIT_CALL_NATIVE 0x6 +#define JIT_CALL_O 0x7 +#define JIT_NEWOBJECT 0x8 +#define JIT_LOAD_PARAMLOCAL_ADDR 0x9 +#define JIT_CALL_PTR 0xa +#define JIT_BOX_CALLVIRT 0xb +#define JIT_INIT_VALUETYPE 0xc +#define JIT_NEW_VECTOR 0xd +#define JIT_NEWOBJECT_VALUETYPE 0xe +#define JIT_IS_INSTANCE 0xf +#define JIT_LOAD_NULL 0x10 +#define JIT_UNBOX2VALUETYPE 0x11 +#define JIT_UNBOX2OBJECT 0x12 +#define JIT_LOAD_FIELD_ADDR 0x13 +#define JIT_DUP_GENERAL 0x14 +#define JIT_POP 0x15 +#define JIT_STORE_OBJECT_VALUETYPE 0x16 +#define JIT_DEREF_CALLVIRT 0x17 +#define JIT_STORE_ELEMENT 0x18 +#define JIT_LEAVE 0x19 +#define JIT_END_FINALLY 0x1a +#define JIT_THROW 0x1b +#define JIT_RETHROW 0x1c +#define JIT_LOADOBJECT 0x1d +#define JIT_LOAD_VECTOR_LEN 0x1e +#define JIT_SWITCH 0x1f +#define JIT_LOAD_ELEMENT_ADDR 0x20 +#define JIT_CALL_INTERFACE 0x21 +#define JIT_CAST_CLASS 0x22 +#define JIT_LOAD_ELEMENT 0x23 +#define JIT_LOADFIELD_VALUETYPE 0x24 +#define JIT_LOADFIELD 0x25 +#define JIT_LOADFUNCTION 0x26 +#define JIT_INVOKE_DELEGATE 0x27 +#define JIT_CALL_PINVOKE 0x28 +#define JIT_LOAD_I64 0x29 +#define JIT_INIT_OBJECT 0x2a +#define JIT_DUP_4 0x2b +#define JIT_DUP_8 0x2c +#define JIT_LOADSTATICFIELDADDRESS_CHECKTYPEINIT 0x2d +#define JIT_POP_4 0x2e +#define JIT_LOAD_F32 0x2f + +#define JIT_LOADPARAMLOCAL_TYPEID 0x30 +#define JIT_LOADPARAMLOCAL_INT64 (JIT_LOADPARAMLOCAL_TYPEID + EVALSTACK_INT64) +#define JIT_LOADPARAMLOCAL_INT32 (JIT_LOADPARAMLOCAL_TYPEID + EVALSTACK_INT32) +#define JIT_LOADPARAMLOCAL_INTNATIVE (JIT_LOADPARAMLOCAL_TYPEID + EVALSTACK_INTNATIVE) +//#define JIT_LOADPARAMLOCAL_F (JIT_LOADPARAMLOCAL_TYPEID + EVALSTACK_F) +#define JIT_LOADPARAMLOCAL_F32 (JIT_LOADPARAMLOCAL_TYPEID + EVALSTACK_F32) +#define JIT_LOADPARAMLOCAL_PTR (JIT_LOADPARAMLOCAL_TYPEID + EVALSTACK_PTR) +#define JIT_LOADPARAMLOCAL_O (JIT_LOADPARAMLOCAL_TYPEID + EVALSTACK_O) +//#define JIT_LOADPARAMLOCAL_TRANSPTR (JIT_LOADPARAMLOCAL_TYPEID + EVALSTACK_TRANSPTR) +#define JIT_LOADPARAMLOCAL_F64 (JIT_LOADPARAMLOCAL_TYPEID + EVALSTACK_F64) +#define JIT_LOADPARAMLOCAL_VALUETYPE (JIT_LOADPARAMLOCAL_TYPEID + EVALSTACK_VALUETYPE) + +#define JIT_STOREPARAMLOCAL_TYPEID 0x38 +#define JIT_STOREPARAMLOCAL_INT64 (JIT_STOREPARAMLOCAL_TYPEID + EVALSTACK_INT64) +#define JIT_STOREPARAMLOCAL_INT32 (JIT_STOREPARAMLOCAL_TYPEID + EVALSTACK_INT32) +#define JIT_STOREPARAMLOCAL_INTNATIVE (JIT_STOREPARAMLOCAL_TYPEID + EVALSTACK_INTNATIVE) +//#define JIT_STOREPARAMLOCAL_F (JIT_STOREPARAMLOCAL_TYPEID + EVALSTACK_F) +#define JIT_STOREPARAMLOCAL_F32 (JIT_STOREPARAMLOCAL_TYPEID + EVALSTACK_F32) +#define JIT_STOREPARAMLOCAL_PTR (JIT_STOREPARAMLOCAL_TYPEID + EVALSTACK_PTR) +#define JIT_STOREPARAMLOCAL_O (JIT_STOREPARAMLOCAL_TYPEID + EVALSTACK_O) +//#define JIT_STOREPARAMLOCAL_TRANSPTR (JIT_STOREPARAMLOCAL_TYPEID + EVALSTACK_TRANSPTR) +#define JIT_STOREPARAMLOCAL_F64 (JIT_STOREPARAMLOCAL_TYPEID + EVALSTACK_F64) +#define JIT_STOREPARAMLOCAL_VALUETYPE (JIT_STOREPARAMLOCAL_TYPEID + EVALSTACK_VALUETYPE) + +#define JIT_STOREFIELD_TYPEID 0x48 +#define JIT_STOREFIELD_INT64 (JIT_STOREFIELD_TYPEID + EVALSTACK_INT64) +#define JIT_STOREFIELD_INT32 (JIT_STOREFIELD_TYPEID + EVALSTACK_INT32) +#define JIT_STOREFIELD_INTNATIVE (JIT_STOREFIELD_TYPEID + EVALSTACK_INTNATIVE) +//#define JIT_STOREFIELD_F (JIT_STOREFIELD_TYPEID + EVALSTACK_F) +#define JIT_STOREFIELD_F32 (JIT_STOREFIELD_TYPEID + EVALSTACK_F32) +#define JIT_STOREFIELD_PTR (JIT_STOREFIELD_TYPEID + EVALSTACK_PTR) +#define JIT_STOREFIELD_O (JIT_STOREFIELD_TYPEID + EVALSTACK_O) +//#define JIT_STOREFIELD_TRANSPTR (JIT_STOREFIELD_TYPEID + EVALSTACK_TRANSPTR) +#define JIT_STOREFIELD_F64 (JIT_STOREFIELD_TYPEID + EVALSTACK_F64) +#define JIT_STOREFIELD_VALUETYPE (JIT_STOREFIELD_TYPEID + EVALSTACK_VALUETYPE) + +#define JIT_LOADSTATICFIELD_CHECKTYPEINIT_TYPEID 0x50 +#define JIT_LOADSTATICFIELD_CHECKTYPEINIT_INT64 (JIT_LOADSTATICFIELD_CHECKTYPEINIT_TYPEID + EVALSTACK_INT64) +#define JIT_LOADSTATICFIELD_CHECKTYPEINIT_INT32 (JIT_LOADSTATICFIELD_CHECKTYPEINIT_TYPEID + EVALSTACK_INT32) +#define JIT_LOADSTATICFIELD_CHECKTYPEINIT_INTNATIVE (JIT_LOADSTATICFIELD_CHECKTYPEINIT_TYPEID + EVALSTACK_INTNATIVE) +//#define JIT_LOADSTATICFIELD_CHECKTYPEINIT_F (JIT_LOADSTATICFIELD_CHECKTYPEINIT_TYPEID + EVALSTACK_F) +#define JIT_LOADSTATICFIELD_CHECKTYPEINIT_F32 (JIT_LOADSTATICFIELD_CHECKTYPEINIT_TYPEID + EVALSTACK_F32) +#define JIT_LOADSTATICFIELD_CHECKTYPEINIT_PTR (JIT_LOADSTATICFIELD_CHECKTYPEINIT_TYPEID + EVALSTACK_PTR) +#define JIT_LOADSTATICFIELD_CHECKTYPEINIT_O (JIT_LOADSTATICFIELD_CHECKTYPEINIT_TYPEID + EVALSTACK_O) +//#define JIT_LOADSTATICFIELD_CHECKTYPEINIT_TRANSPTR (JIT_LOADSTATICFIELD_CHECKTYPEINIT_TYPEID + EVALSTACK_TRANSPTR) +#define JIT_LOADSTATICFIELD_CHECKTYPEINIT_F64 (JIT_LOADSTATICFIELD_CHECKTYPEINIT_TYPEID + EVALSTACK_F64) +#define JIT_LOADSTATICFIELD_CHECKTYPEINIT_VALUETYPE (JIT_LOADSTATICFIELD_CHECKTYPEINIT_TYPEID + EVALSTACK_VALUETYPE) + +#define JIT_LOADSTATICFIELD_TYPEID 0x58 +#define JIT_LOADSTATICFIELD_INT64 (JIT_LOADSTATICFIELD_TYPEID + EVALSTACK_INT64) +#define JIT_LOADSTATICFIELD_INT32 (JIT_LOADSTATICFIELD_TYPEID + EVALSTACK_INT32) +#define JIT_LOADSTATICFIELD_INTNATIVE (JIT_LOADSTATICFIELD_TYPEID + EVALSTACK_INTNATIVE) +//#define JIT_LOADSTATICFIELD_F (JIT_LOADSTATICFIELD_TYPEID + EVALSTACK_F) +#define JIT_LOADSTATICFIELD_F32 (JIT_LOADSTATICFIELD_TYPEID + EVALSTACK_F32) +#define JIT_LOADSTATICFIELD_PTR (JIT_LOADSTATICFIELD_TYPEID + EVALSTACK_PTR) +#define JIT_LOADSTATICFIELD_O (JIT_LOADSTATICFIELD_TYPEID + EVALSTACK_O) +//#define JIT_LOADSTATICFIELD_TRANSPTR (JIT_LOADSTATICFIELD_TYPEID + EVALSTACK_TRANSPTR) +#define JIT_LOADSTATICFIELD_F64 (JIT_LOADSTATICFIELD_TYPEID + EVALSTACK_F64) +#define JIT_LOADSTATICFIELD_VALUEPTYE (JIT_LOADSTATICFIELD_TYPEID + EVALSTACK_VALUETYPE) + +#define JIT_STORESTATICFIELD_TYPEID 0x60 +#define JIT_STORESTATICFIELD_INT64 (JIT_STORESTATICFIELD_TYPEID + EVALSTACK_INT64) +#define JIT_STORESTATICFIELD_INT32 (JIT_STORESTATICFIELD_TYPEID + EVALSTACK_INT32) +#define JIT_STORESTATICFIELD_INTNATIVE (JIT_STORESTATICFIELD_TYPEID + EVALSTACK_INTNATIVE) +//#define JIT_STORESTATICFIELD_F (JIT_STORESTATICFIELD_TYPEID + EVALSTACK_F) +#define JIT_STORESTATICFIELD_F32 (JIT_STORESTATICFIELD_TYPEID + EVALSTACK_F32) +#define JIT_STORESTATICFIELD_F64 (JIT_STORESTATICFIELD_TYPEID + EVALSTACK_F64) +#define JIT_STORESTATICFIELD_PTR (JIT_STORESTATICFIELD_TYPEID + EVALSTACK_PTR) +#define JIT_STORESTATICFIELD_O (JIT_STORESTATICFIELD_TYPEID + EVALSTACK_O) +//#define JIT_STORESTATICFIELD_TRANSPTR (JIT_STORESTATICFIELD_TYPEID + EVALSTACK_TRANSPTR) +#define JIT_STORESTATICFIELD_VALUETYPE (JIT_STORESTATICFIELD_TYPEID + EVALSTACK_VALUETYPE) + +#define JIT_BOX_TYPEID 0x68 +#define JIT_BOX_INT64 (JIT_BOX_TYPEID + EVALSTACK_INT64) +#define JIT_BOX_INT32 (JIT_BOX_TYPEID + EVALSTACK_INT32) +#define JIT_BOX_INTNATIVE (JIT_BOX_TYPEID + EVALSTACK_INTNATIVE) +//#define JIT_BOX_F (JIT_BOX_TYPEID + EVALSTACK_F) +#define JIT_BOX_F32 (JIT_BOX_TYPEID + EVALSTACK_F32) +#define JIT_BOX_PTR (JIT_BOX_TYPEID + EVALSTACK_PTR) +#define JIT_BOX_O (JIT_BOX_TYPEID + EVALSTACK_O) +//#define JIT_BOX_TRANSPTR (JIT_BOX_TYPEID + EVALSTACK_TRANSPTR) +#define JIT_BOX_F64 (JIT_BOX_TYPEID + EVALSTACK_F64) +#define JIT_BOX_VALUETYPE (JIT_BOX_TYPEID + EVALSTACK_VALUETYPE) + +#define JIT_CEQ_I32I32 0x70 +#define JIT_CGT_I32I32 0x71 +#define JIT_CGT_UN_I32I32 0x72 +#define JIT_CLT_I32I32 0x73 +#define JIT_CLT_UN_I32I32 0x74 + +#define JIT_CEQ_I64I64 0x75 +#define JIT_CGT_I64I64 0x76 +#define JIT_CGT_UN_I64I64 0x77 +#define JIT_CLT_I64I64 0x78 +#define JIT_CLT_UN_I64I64 0x79 + +#define JIT_ADD_OVF_I32I32 0x7a +#define JIT_ADD_OVF_UN_I32I32 0x7b +#define JIT_MUL_OVF_I32I32 0x7c +#define JIT_MUL_OVF_UN_I32I32 0x7d +#define JIT_SUB_OVF_I32I32 0x7e +#define JIT_SUB_OVF_UN_I32I32 0x7f +#define JIT_ADD_I32I32 0x80 +#define JIT_SUB_I32I32 0x81 +#define JIT_MUL_I32I32 0x82 +#define JIT_DIV_I32I32 0x83 +#define JIT_DIV_UN_I32I32 0x84 +#define JIT_REM_I32I32 0x85 +#define JIT_REM_UN_I32I32 0x86 +#define JIT_AND_I32I32 0x87 +#define JIT_OR_I32I32 0x88 +#define JIT_XOR_I32I32 0x89 + +#define JIT_NEG_I32 0x8a +#define JIT_NOT_I32 0x8b +#define JIT_NEG_I64 0x8c +#define JIT_NOT_I64 0x8d + +#define JIT_BOX_NULLABLE 0x8e +#define JIT_LOAD_F64 0x8f + +#define JIT_BEQ_I32I32 0x90 +#define JIT_BGE_I32I32 0x91 +#define JIT_BGT_I32I32 0x92 +#define JIT_BLE_I32I32 0x93 +#define JIT_BLT_I32I32 0x94 +#define JIT_BNE_UN_I32I32 0x95 +#define JIT_BGE_UN_I32I32 0x96 +#define JIT_BGT_UN_I32I32 0x97 +#define JIT_BLE_UN_I32I32 0x98 +#define JIT_BLT_UN_I32I32 0x99 + +#define JIT_BEQ_I64I64 0x9a +#define JIT_BGE_I64I64 0x9b +#define JIT_BGT_I64I64 0x9c +#define JIT_BLE_I64I64 0x9d +#define JIT_BLT_I64I64 0x9e +#define JIT_BNE_UN_I64I64 0x9f +#define JIT_BGE_UN_I64I64 0xa0 +#define JIT_BGT_UN_I64I64 0xa1 +#define JIT_BLE_UN_I64I64 0xa2 +#define JIT_BLT_UN_I64I64 0xa3 + +#define JIT_SHL_I32 0xa8 +#define JIT_SHR_I32 0xa9 +#define JIT_SHR_UN_I32 0xaa +#define JIT_SHL_I64 0xab +#define JIT_SHR_I64 0xac +#define JIT_SHR_UN_I64 0xad + +#define JIT_BRANCH_FALSE 0xae +#define JIT_BRANCH_TRUE 0xaf + +#define JIT_LOADTOKEN_BASE 0xb0 +#define JIT_LOADTOKEN_TYPE (JIT_LOADTOKEN_BASE + 0) +#define JIT_LOADTOKEN_METHOD (JIT_LOADTOKEN_BASE + 1) +#define JIT_LOADTOKEN_FIELD (JIT_LOADTOKEN_BASE + 2) + +#define JIT_LOADINDIRECT_I8 0xb3 +#define JIT_LOADINDIRECT_U8 0xb4 +#define JIT_LOADINDIRECT_I16 0xb5 +#define JIT_LOADINDIRECT_U16 0xb6 +#define JIT_LOADINDIRECT_I32 0xb7 +#define JIT_LOADINDIRECT_U32 0xb8 +#define JIT_LOADINDIRECT_I64 0xb9 +#define JIT_LOADINDIRECT_I 0xba +#define JIT_LOADINDIRECT_R32 0xbb +#define JIT_LOADINDIRECT_R64 0xbc +#define JIT_LOADINDIRECT_REF 0xbd + +#define JIT_STOREINDIRECT_REF 0xbe +#define JIT_STOREINDIRECT_U8 0xbf +#define JIT_STOREINDIRECT_U16 0xc0 +#define JIT_STOREINDIRECT_U32 0xc1 +#define JIT_STOREINDIRECT_U64 0xc2 +#define JIT_STOREINDIRECT_R32 0xc3 +#define JIT_STOREINDIRECT_R64 0xc4 + +//#define JIT_CONV_SIGNED32 0xc5 +//#define JIT_CONV_UNSIGNED32 0xc6 +//#define JIT_CONV_INT_I64 0xc7 + +//#define JIT_CONV_I1 0xc5 +//#define JIT_CONV_I2 0xc6 +//#define JIT_CONV_I4 0xc7 +//#define JIT_CONV_I8 0xc8 +//#define JIT_CONV_R4 0xc9 +//#define JIT_CONV_R8 0xca +//#define JIT_CONV_U4 0xcb +//#define JIT_CONV_U8 0xcc +//#define JIT_CONV_U2 0xcd +//#define JIT_CONV_U1 0xce +//#define JIT_CONV_I_NATIVE 0xcf +//#define JIT_CONV_U_NATIVE 0xd0 + +//#define JIT_CONV_OVF_I1 0xd1 +//#define JIT_CONV_OVF_U1 0xd2 +//#define JIT_CONV_OVF_I2 0xd3 +//#define JIT_CONV_OVF_U2 0xd4 +//#define JIT_CONV_OVF_I4 0xd5 +//#define JIT_CONV_OVF_U4 0xd6 +//#define JIT_CONV_OVF_I8 0xd7 +//#define JIT_CONV_OVF_U8 0xd8 + +#define JIT_UNBOX_NULLABLE 0xda + +#define JIT_STORE_ELEMENT_32 0xde +#define JIT_STORE_ELEMENT_64 0xdf + +#define JIT_LOAD_ELEMENT_I8 0xe0 +#define JIT_LOAD_ELEMENT_U8 0xe1 +#define JIT_LOAD_ELEMENT_I16 0xe2 +#define JIT_LOAD_ELEMENT_U16 0xe3 +#define JIT_LOAD_ELEMENT_I32 0xe4 +#define JIT_LOAD_ELEMENT_U32 0xe5 +#define JIT_LOAD_ELEMENT_I64 0xe6 +#define JIT_LOAD_ELEMENT_R32 0xe7 +#define JIT_LOAD_ELEMENT_R64 0xe8 + +#define JIT_ADD_OVF_I64I64 0xea +#define JIT_ADD_OVF_UN_I64I64 0xeb +#define JIT_MUL_OVF_I64I64 0xec +#define JIT_MUL_OVF_UN_I64I64 0xed +#define JIT_SUB_OVF_I64I64 0xee +#define JIT_SUB_OVF_UN_I64I64 0xef +#define JIT_ADD_I64I64 0xf0 +#define JIT_SUB_I64I64 0xf1 +#define JIT_MUL_I64I64 0xf2 +#define JIT_DIV_I64I64 0xf3 +#define JIT_DIV_UN_I64I64 0xf4 +#define JIT_REM_I64I64 0xf5 +#define JIT_REM_UN_I64I64 0xf6 +#define JIT_AND_I64I64 0xf7 +#define JIT_OR_I64I64 0xf8 +#define JIT_XOR_I64I64 0xf9 + +#define JIT_CEQ_F32F32 0xfa +#define JIT_CGT_F32F32 0xfb +#define JIT_CGT_UN_F32F32 0xfc +#define JIT_CLT_F32F32 0xfd +#define JIT_CLT_UN_F32F32 0xfe + +#define JIT_BEQ_F32F32 0xff +#define JIT_BGE_F32F32 0x100 +#define JIT_BGT_F32F32 0x101 +#define JIT_BLE_F32F32 0x102 +#define JIT_BLT_F32F32 0x103 +#define JIT_BNE_UN_F32F32 0x104 +#define JIT_BGE_UN_F32F32 0x105 +#define JIT_BGT_UN_F32F32 0x106 +#define JIT_BLE_UN_F32F32 0x107 +#define JIT_BLT_UN_F32F32 0x108 + +#define JIT_ADD_F32F32 0x109 +#define JIT_SUB_F32F32 0x10a +#define JIT_MUL_F32F32 0x10b +#define JIT_DIV_F32F32 0x10c +#define JIT_DIV_UN_F32F32 0x10d // Never used +#define JIT_REM_F32F32 0x10e +#define JIT_REM_UN_F32F32 0x10f // Never used + +#define JIT_CEQ_F64F64 0x110 +#define JIT_CGT_F64F64 0x111 +#define JIT_CGT_UN_F64F64 0x112 +#define JIT_CLT_F64F64 0x113 +#define JIT_CLT_UN_F64F64 0x114 + +#define JIT_BEQ_F64F64 0x115 +#define JIT_BGE_F64F64 0x116 +#define JIT_BGT_F64F64 0x117 +#define JIT_BLE_F64F64 0x118 +#define JIT_BLT_F64F64 0x119 +#define JIT_BNE_UN_F64F64 0x11a +#define JIT_BGE_UN_F64F64 0x11b +#define JIT_BGT_UN_F64F64 0x11c +#define JIT_BLE_UN_F64F64 0x11d +#define JIT_BLT_UN_F64F64 0x11e + +#define JIT_ADD_F64F64 0x11f +#define JIT_SUB_F64F64 0x120 +#define JIT_MUL_F64F64 0x121 +#define JIT_DIV_F64F64 0x122 +#define JIT_DIV_UN_F64F64 0x123 // Never used +#define JIT_REM_F64F64 0x124 +#define JIT_REM_UN_F64F64 0x125 // Never used + +#define JIT_LOADPARAMLOCAL_0 0x127 // Load 4-byte param/local at offset 0 +#define JIT_LOADPARAMLOCAL_1 0x128 // Load 4-byte param/local at offset 4 +#define JIT_LOADPARAMLOCAL_2 0x129 // Load 4-byte param/local at offset 8 +#define JIT_LOADPARAMLOCAL_3 0x12a // Load 4-byte param/local at offset 12 +#define JIT_LOADPARAMLOCAL_4 0x12b // Load 4-byte param/local at offset 16 +#define JIT_LOADPARAMLOCAL_5 0x12c // Load 4-byte param/local at offset 20 +#define JIT_LOADPARAMLOCAL_6 0x12d // Load 4-byte param/local at offset 24 +#define JIT_LOADPARAMLOCAL_7 0x12e // Load 4-byte param/local at offset 28 + +#define JIT_STOREPARAMLOCAL_0 0x12f // Store 4-byte param/local at offset 0 +#define JIT_STOREPARAMLOCAL_1 0x130 // Store 4-byte param/local at offset 4 +#define JIT_STOREPARAMLOCAL_2 0x131 // Store 4-byte param/local at offset 8 +#define JIT_STOREPARAMLOCAL_3 0x132 // Store 4-byte param/local at offset 12 +#define JIT_STOREPARAMLOCAL_4 0x133 // Store 4-byte param/local at offset 16 +#define JIT_STOREPARAMLOCAL_5 0x134 // Store 4-byte param/local at offset 20 +#define JIT_STOREPARAMLOCAL_6 0x135 // Store 4-byte param/local at offset 24 +#define JIT_STOREPARAMLOCAL_7 0x136 // Store 4-byte param/local at offset 28 + +#define JIT_LOAD_I4_M1 0x137 +#define JIT_LOAD_I4_0 0x138 +#define JIT_LOAD_I4_1 0x139 +#define JIT_LOAD_I4_2 0x13a + +#define JIT_LOADFIELD_4 0x13b + +#define JIT_CONV_OFFSET_I32 0 +#define JIT_CONV_OFFSET_U32 1 +#define JIT_CONV_OFFSET_I64 2 +#define JIT_CONV_OFFSET_U64 3 +#define JIT_CONV_OFFSET_R32 4 +#define JIT_CONV_OFFSET_R64 5 + +#define JIT_CONV_FROM_I32 0x140 +#define JIT_CONV_I32_I32 (JIT_CONV_FROM_I32 + JIT_CONV_OFFSET_I32) +#define JIT_CONV_I32_U32 (JIT_CONV_FROM_I32 + JIT_CONV_OFFSET_U32) +#define JIT_CONV_I32_I64 (JIT_CONV_FROM_I32 + JIT_CONV_OFFSET_I64) +#define JIT_CONV_I32_U64 (JIT_CONV_FROM_I32 + JIT_CONV_OFFSET_U64) +#define JIT_CONV_I32_R32 (JIT_CONV_FROM_I32 + JIT_CONV_OFFSET_R32) +#define JIT_CONV_I32_R64 (JIT_CONV_FROM_I32 + JIT_CONV_OFFSET_R64) + +#define JIT_CONV_FROM_U32 0x146 +#define JIT_CONV_U32_I32 (JIT_CONV_FROM_U32 + JIT_CONV_OFFSET_I32) +#define JIT_CONV_U32_U32 (JIT_CONV_FROM_U32 + JIT_CONV_OFFSET_U32) +#define JIT_CONV_U32_I64 (JIT_CONV_FROM_U32 + JIT_CONV_OFFSET_I64) +#define JIT_CONV_U32_U64 (JIT_CONV_FROM_U32 + JIT_CONV_OFFSET_U64) +#define JIT_CONV_U32_R32 (JIT_CONV_FROM_U32 + JIT_CONV_OFFSET_R32) +#define JIT_CONV_U32_R64 (JIT_CONV_FROM_U32 + JIT_CONV_OFFSET_R64) + +#define JIT_CONV_FROM_I64 0x14c +#define JIT_CONV_I64_I32 (JIT_CONV_FROM_I64 + JIT_CONV_OFFSET_I32) +#define JIT_CONV_I64_U32 (JIT_CONV_FROM_I64 + JIT_CONV_OFFSET_U32) +#define JIT_CONV_I64_I64 (JIT_CONV_FROM_I64 + JIT_CONV_OFFSET_I64) // Not used +#define JIT_CONV_I64_U64 (JIT_CONV_FROM_I64 + JIT_CONV_OFFSET_U64) // Not used +#define JIT_CONV_I64_R32 (JIT_CONV_FROM_I64 + JIT_CONV_OFFSET_R32) +#define JIT_CONV_I64_R64 (JIT_CONV_FROM_I64 + JIT_CONV_OFFSET_R64) + +#define JIT_CONV_FROM_U64 0x152 +#define JIT_CONV_U64_I32 (JIT_CONV_FROM_U64 + JIT_CONV_OFFSET_I32) +#define JIT_CONV_U64_U32 (JIT_CONV_FROM_U64 + JIT_CONV_OFFSET_U32) +#define JIT_CONV_U64_I64 (JIT_CONV_FROM_U64 + JIT_CONV_OFFSET_I64) // Not used +#define JIT_CONV_U64_U64 (JIT_CONV_FROM_U64 + JIT_CONV_OFFSET_U64) // Not used +#define JIT_CONV_U64_R32 (JIT_CONV_FROM_U64 + JIT_CONV_OFFSET_R32) +#define JIT_CONV_U64_R64 (JIT_CONV_FROM_U64 + JIT_CONV_OFFSET_R64) + +#define JIT_CONV_FROM_R32 0x158 +#define JIT_CONV_R32_I32 (JIT_CONV_FROM_R32 + JIT_CONV_OFFSET_I32) +#define JIT_CONV_R32_U32 (JIT_CONV_FROM_R32 + JIT_CONV_OFFSET_U32) +#define JIT_CONV_R32_I64 (JIT_CONV_FROM_R32 + JIT_CONV_OFFSET_I64) +#define JIT_CONV_R32_U64 (JIT_CONV_FROM_R32 + JIT_CONV_OFFSET_U64) +#define JIT_CONV_R32_R32 (JIT_CONV_FROM_R32 + JIT_CONV_OFFSET_R32) +#define JIT_CONV_R32_R64 (JIT_CONV_FROM_R32 + JIT_CONV_OFFSET_R64) + +#define JIT_CONV_FROM_R64 0x15e +#define JIT_CONV_R64_I32 (JIT_CONV_FROM_R64 + JIT_CONV_OFFSET_I32) +#define JIT_CONV_R64_U32 (JIT_CONV_FROM_R64 + JIT_CONV_OFFSET_U32) +#define JIT_CONV_R64_I64 (JIT_CONV_FROM_R64 + JIT_CONV_OFFSET_I64) +#define JIT_CONV_R64_U64 (JIT_CONV_FROM_R64 + JIT_CONV_OFFSET_U64) +#define JIT_CONV_R64_R32 (JIT_CONV_FROM_R64 + JIT_CONV_OFFSET_R32) +#define JIT_CONV_R64_R64 (JIT_CONV_FROM_R64 + JIT_CONV_OFFSET_R64) + + +#endif diff --git a/dna/Makefile b/dna/Makefile new file mode 100644 index 0000000..efcc1c8 --- /dev/null +++ b/dna/Makefile @@ -0,0 +1,57 @@ +.include + +PROG= dna + +SRCS= CLIFile.c +SRCS+= Delegate.c +SRCS+= dna.c +SRCS+= Finalizer.c +SRCS+= Generics.c +SRCS+= Heap.c +SRCS+= InternalCall.c +SRCS+= JIT.c +SRCS+= JIT_Execute.c +SRCS+= MetaData.c +SRCS+= MetaData_Fill.c +SRCS+= MetaData_Search.c +SRCS+= MethodState.c +SRCS+= PInvoke.c +SRCS+= RVA.c +SRCS+= Sys.c +SRCS+= Thread.c +SRCS+= Type.c + +SRCS+= System.Array.c +SRCS+= System.Char.c +SRCS+= System.Console.c +SRCS+= System.DateTime.c +SRCS+= System.Diagnostics.Debugger.c +SRCS+= System.Environment.c +SRCS+= System.Enum.c +SRCS+= System.GC.c +SRCS+= System.IO.FileInternal.c +SRCS+= System.Math.c +SRCS+= System.Net.Dns.c +SRCS+= System.Net.Sockets.Socket.c +SRCS+= System.Object.c +SRCS+= System.Runtime.CompilerServices.RuntimeHelpers.c +SRCS+= System.RuntimeType.c +SRCS+= System.String.c +SRCS+= System.Type.c +SRCS+= System.Threading.Interlocked.c +SRCS+= System.Threading.Monitor.c +SRCS+= System.Threading.Thread.c +SRCS+= System.ValueType.c +SRCS+= System.WeakReference.c + +#CFLAGS= -O0 -g -I. -Wall -Werror +#-mips2 -mcpu=r3900 +#CFLAGS= -Os -g -I. -Wall -Werror -mips2 -mcpu=r3900 +CFLAGS= -Os -I. -Wall -Werror + +LDFLAGS+=--no-undefined +LDADD+=-s +LDADD+=-lm + +.include + diff --git a/dna/MetaData.c b/dna/MetaData.c new file mode 100644 index 0000000..758b6e7 --- /dev/null +++ b/dna/MetaData.c @@ -0,0 +1,619 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "MetaData.h" + +#include "Types.h" +#include "Type.h" +#include "RVA.h" + +unsigned int MetaData_DecodeSigEntry(SIG *pSig) { + unsigned char a,b,c,d; + a = *((unsigned char*)*pSig)++; + if ((a & 0x80) == 0) { + // 1-byte entry + return a; + } + // Special case + if (a == 0xff) { + return 0; + } + + b = *((unsigned char*)*pSig)++; + if ((a & 0xc0) == 0x80) { + // 2-byte entry + return ((int)(a & 0x3f)) << 8 | b; + } + // 4-byte entry + c = *((unsigned char*)*pSig)++; + d = *((unsigned char*)*pSig)++; + return ((int)(a & 0x1f)) << 24 | ((int)b) << 16 | ((int)c) << 8 | d; +} + +IDX_TABLE MetaData_DecodeSigEntryToken(SIG *pSig) { + static U8 tableID[4] = {MD_TABLE_TYPEDEF, MD_TABLE_TYPEREF, MD_TABLE_TYPESPEC, 0}; + + U32 entry = MetaData_DecodeSigEntry(pSig); + return MAKE_TABLE_INDEX(tableID[entry & 0x3], entry >> 2); +} + +tMetaData* MetaData() { + tMetaData *pRet = TMALLOC(tMetaData); + memset(pRet, 0, sizeof(tMetaData)); + return pRet; +} + +void MetaData_LoadStrings(tMetaData *pThis, void *pStream, unsigned int streamLen) { + pThis->strings.pStart = (unsigned char*)pStream; + + log_f(1, "Loaded strings\n"); +} + +unsigned int MetaData_DecodeHeapEntryLength(unsigned char **ppHeapEntry) { + return MetaData_DecodeSigEntry((SIG*)ppHeapEntry); +} + +void MetaData_LoadBlobs(tMetaData *pThis, void *pStream, unsigned int streamLen) { + pThis->blobs.pStart = (unsigned char*)pStream; + + log_f(1, "Loaded blobs\n"); + +} + +void MetaData_LoadUserStrings(tMetaData *pThis, void *pStream, unsigned int streamLen) { + pThis->userStrings.pStart = (unsigned char*)pStream; + + log_f(1, "Loaded User Strings\n"); + +} + +void MetaData_LoadGUIDs(tMetaData *pThis, void *pStream, unsigned int streamLen) { + pThis->GUIDs.numGUIDs = streamLen / 16; + + // This is stored -16 because numbering starts from 1. This means that a simple indexing calculation + // can be used, as if it started from 0 + pThis->GUIDs.pGUID1 = (unsigned char*)pStream; + + log_f(1, "Read %d GUIDs\n", pThis->GUIDs.numGUIDs); +} + +/* +Format of definition strings: +Always 2 characters to togther. 1st character defines source, 2nd defines destination. +Sources: + c: 8-bit value + s: 16-bit short + i: 32-bit int + S: Index into string heap + G: Index into GUID heap + B: Index into BLOB heap + 0: Coded index: TypeDefOrRef + 1: Coded index: HasConstant + 2: Coded index: HasCustomAttribute + 3: Coded index: HasFieldMarshall + 4: Coded index: HasDeclSecurity + 5: Coded index: MemberRefParent + 6: Coded index: HasSemantics + 7: Coded index: MethodDefOrRef + 8: Coded index: MemberForwarded + 9: Coded index: Implementation + :: Coded index: CustomAttributeType + ;: Coded index: ResolutionScope + <: Coded index: TypeOrMethodDef + \x00 - \x2c: Simple indexes into the respective table + ^: RVA: Convert to pointer + x: Nothing, use 0 + m: This metadata pointer + l: (lower case L) Boolean, is this the last entry in this table? + I: The original table index for this table item +Destination: + x: nowhere, ignore + *: 32-bit index into relevant heap; + Or coded index - MSB = which table, other 3 bytes = table index + Or 32-bit int + Or pointer (also RVA) + s: 16-bit value + c: 8-bit value +*/ +static char* tableDefs[] = { + // 0x00 + "sxS*G*GxGx", + // 0x01 + "x*;*S*S*", + // 0x02 + "x*m*i*S*S*0*\x04*\x06*xclcxcxcx*x*x*x*x*x*x*x*x*x*x*I*x*x*x*x*x*x*x*x*x*x*x*x*", + // 0x03 + NULL, + // 0x04 + "x*m*ssxsS*B*x*x*x*x*I*x*", + // 0x05 + NULL, + // 0x06 + "x*m*^*ssssS*B*\x08*x*x*x*x*x*x*I*x*x*x*" +#ifdef GEN_COMBINED_OPCODES + "x*x*x*x*x*x*" +#endif +#ifdef DIAG_METHOD_CALLS + "x*x*x*" +#endif + , + // 0x07 + NULL, + // 0x08 + "ssssS*", + // 0x09 + "\x02*0*", + // 0x0A + "x*5*S*B*", + // 0x0B + "ccccxs1*B*", + // 0x0C + "2*:*B*", + // 0x0D + NULL, + // 0x0E + "ssxs4*B*", + // 0x0F + "ssxsi*\x02*", + // 0x10 + NULL, + // 0x11 + "B*", + // 0x12 + "\x02*\x14*", + // 0x13 + NULL, + // 0x14 + "ssxsS*0*", + // 0x15 + "\x02*\x17*", + // 0x16 + NULL, + // 0x17 + "ssxsS*B*", + // 0x18 + "ssxs\06*6*", + // 0x19 + "\x02*7*7*", + // 0x1A + "S*", + // 0x1B + "x*m*B*", + // 0x1C + "ssxs8*S*\x1a*", + // 0x1D + "^*\x04*", + // 0x1E + NULL, + // 0x1F + NULL, + // 0x20 + "i*ssssssssi*B*S*S*", + // 0x21 + NULL, + // 0x22 + NULL, + // 0x23 + "ssssssssi*B*S*S*B*", + // 0x24 + NULL, + // 0x25 + NULL, + // 0x26 + NULL, + // 0x27 + NULL, + // 0x28 + NULL, + // 0x29 + "\x02*\x02*", + // 0x2A + "ssss<*S*", + // 0x2B + "x*m*7*B*", + // 0x2C + "\x2a*0*", +}; + +// Coded indexes use this lookup table. +// Note that the extra 'z' characters are important! +// (Because of how the lookup works each string must be a power of 2 in length) +static unsigned char* codedTags[] = { + // TypeDefOrRef + "\x02\x01\x1Bz", + // HasConstant + "\x04\x08\x17z", + // HasCustomAttribute + "\x06\x04\x01\x02\x08\x09\x0A\x00\x0E\x17\x14\x11\x1A\x1B\x20\x23\x26\x27\x28zzzzzzzzzzzzz", + // HasFieldMarshall + "\x04\x08", + // HasDeclSecurity + "\x02\x06\x20z", + // MemberRefParent + "z\x01\x1A\x06\x1Bzzz", + // HasSemantics + "\x14\x17", + // MethodDefOrRef + "\x06\x0A", + // MemberForwarded + "\x04\x06", + // Implementation + "\x26\x23\x27z", + // CustomAttributeType + "zz\x06\x0Azzzz", + // ResolutionScope + "\x00\x1A\x23\x01", + // TypeOrMethodDef + "\x02\x06", +}; + +static unsigned char codedTagBits[] = { + 2, 2, 5, 1, 2, 3, 1, 1, 1, 2, 3, 2, 1 +}; + +static unsigned char tableRowSize[MAX_TABLES]; + +void MetaData_Init() { + U32 i; + for (i=0; itables.numRows[tableID]; + int rowLen = 0; // Number of bytes taken by each row in memory. + int i, row; + char *pDef = tableDefs[tableID]; + int defLen = (int)strlen(pDef); + void *pRet; + unsigned char *pSource = *ppTable; + unsigned char *pDest; + unsigned int v; + + // Calculate the destination row size from table definition, if it hasn't already been calculated + if (tableRowSize[tableID] == 0) { + for (i=0; itables.numRows[d] < 0x10000) { + // Use 16-bit offset + v = GetU16(pSource); + pSource += 2; + } else { + // Use 32-bit offset + v = GetU32(pSource); + pSource += 4; + } + v |= d << 24; + } else { + switch (d) { + case 'c': // 8-bit value + v = *(U8*)pSource; + pSource++; + break; + case 's': // 16-bit short + v = GetU16(pSource); + pSource += 2; + break; + case 'i': // 32-bit int + v = GetU32(pSource); + pSource += 4; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '<': + { + int ofs = pDef[i] - '0'; + char* pCoding = codedTags[ofs]; + int tagBits = codedTagBits[ofs]; + unsigned char tag = *pSource & ((1 << tagBits) - 1); + int idxIntoTableID = pCoding[tag]; // The actual table index that we're looking for + if (idxIntoTableID < 0 || idxIntoTableID > MAX_TABLES) { + printf("Error: Bad table index: 0x%02x\n", idxIntoTableID); + exit(1); + } + if (pThis->tables.codedIndex32Bit[ofs]) { + // Use 32-bit number + v = GetU32(pSource) >> tagBits; + pSource += 4; + } else { + // Use 16-bit number + v = GetU16(pSource) >> tagBits; + pSource += 2; + } + v |= idxIntoTableID << 24; + } + break; + case 'S': // index into string heap + if (pThis->index32BitString) { + v = GetU32(pSource); + pSource += 4; + } else { + v = GetU16(pSource); + pSource += 2; + } + v = (unsigned int)(pThis->strings.pStart + v); + break; + case 'G': // index into GUID heap + if (pThis->index32BitGUID) { + v = GetU32(pSource); + pSource += 4; + } else { + v = GetU16(pSource); + pSource += 2; + } + v = (unsigned int)(pThis->GUIDs.pGUID1 + ((v-1) * 16)); + break; + case 'B': // index into BLOB heap + if (pThis->index32BitBlob) { + v = GetU32(pSource); + pSource += 4; + } else { + v = GetU16(pSource); + pSource += 2; + } + v = (unsigned int)(pThis->blobs.pStart + v); + break; + case '^': // RVA to convert to pointer + v = GetU32(pSource); + pSource += 4; + v = (unsigned int)RVA_FindData(pRVA, v); + break; + case 'm': // Pointer to this metadata + v = (unsigned int)pThis; + break; + case 'l': // Is this the last table entry? + v = (row == numRows - 1); + break; + case 'I': // Original table index + v = MAKE_TABLE_INDEX(tableID, row + 1); + break; + case 'x': // Nothing, use 0 + v = 0; + break; + default: + Crash("Cannot handle MetaData source definition character '%c' (0x%02X)\n", d, d); + } + } + switch (pDef[i+1]) { + case '*': + *(unsigned int*)pDest = v; + pDest += 4; + break; + case 's': + *(unsigned short*)pDest = (unsigned short)v; + pDest += 2; + break; + case 'c': + *(unsigned char*)pDest = (unsigned char)v; + pDest++; + break; + case 'x': + // Do nothing + break; + default: + Crash("Cannot handle MetaData destination definition character '%c'\n", pDef[i+1]); + } + } + } + + log_f(1, "Loaded MetaData table 0x%02X; %d rows\n", tableID, numRows); + + // Update the parameter to the position after this table + *ppTable = pSource; + // Return new table information + return pRet; +} + +void MetaData_LoadTables(tMetaData *pThis, tRVA *pRVA, void *pStream, unsigned int streamLen) { + U64 valid, j; + unsigned char c; + int i, k, numTables; + void *pTable; + + c = *(unsigned char*)&((char*)pStream)[6]; + pThis->index32BitString = (c & 1) > 0; + pThis->index32BitGUID = (c & 2) > 0; + pThis->index32BitBlob = (c & 4) > 0; + + valid = *(U64*)&((char*)pStream)[8]; + + // Count how many tables there are, and read in all the number of rows of each table. + numTables = 0; + for (i=0, j=1; itables.numRows[i] = *(unsigned int*)&((char*)pStream)[24 + numTables * 4]; + numTables++; + } else { + pThis->tables.numRows[i] = 0; + pThis->tables.data[i] = NULL; + } + } + + // Determine if each coded index lookup type needs to use 16 or 32 bit indexes + for (i=0; i<13; i++) { + char* pCoding = codedTags[i]; + int tagBits = codedTagBits[i]; + // Discover max table size + unsigned int maxTableLen = 0; + for (k=0; k < (1<tables.numRows[t] > maxTableLen) { + maxTableLen = pThis->tables.numRows[t]; + } + } + } + if (maxTableLen < (unsigned)(1 << (16 - tagBits))) { + // Use 16-bit number + pThis->tables.codedIndex32Bit[i] = 0; + } else { + // Use 32-bit number + pThis->tables.codedIndex32Bit[i] = 1; + } + } + + pTable = &((char*)pStream)[24 + numTables * 4]; + + for (i=0; itables.numRows[i] > 0) { + if (i*4 >= sizeof(tableDefs) || tableDefs[i] == NULL) { + printf("No table definition for MetaData table 0x%02x\n", i); + exit(1); + } + pThis->tables.data[i] = LoadSingleTable(pThis, pRVA, i, &pTable); + } + } +} + +PTR MetaData_GetBlob(BLOB_ blob, U32 *pBlobLength) { + unsigned int len = MetaData_DecodeHeapEntryLength(&blob); + if (pBlobLength != NULL) { + *pBlobLength = len; + } + return blob; +} + +// Returns length in bytes, not characters +STRING2 MetaData_GetUserString(tMetaData *pThis, IDX_USERSTRINGS index, unsigned int *pStringLength) { + unsigned char *pString = pThis->userStrings.pStart + (index & 0x00ffffff); + unsigned int len = MetaData_DecodeHeapEntryLength(&pString); + if (pStringLength != NULL) { + // -1 because of extra terminating character in the heap + *pStringLength = len - 1; + } + return (STRING2)pString; +} + +void* MetaData_GetTableRow(tMetaData *pThis, IDX_TABLE index) { + char *pData; + + if (TABLE_OFS(index) == 0) { + return NULL; + } + pData = (char*)pThis->tables.data[TABLE_ID(index)]; + // Table indexes start at one, hence the -1 here. + return pData + (TABLE_OFS(index) - 1) * tableRowSize[TABLE_ID(index)]; +} + +void MetaData_GetConstant(tMetaData *pThis, IDX_TABLE idx, PTR pResultMem) { + tMD_Constant *pConst; + + switch (TABLE_ID(idx)) { + case MD_TABLE_FIELDDEF: + { + tMD_FieldDef *pField = (tMD_FieldDef*)MetaData_GetTableRow(pThis, idx); + pConst = (tMD_Constant*)pField->pMemory; + } + break; + default: + Crash("MetaData_GetConstant() Cannot handle idx: 0x%08x", idx); + } + + switch (pConst->type) { + case ELEMENT_TYPE_I4: + //*(U32*)pReturnMem = MetaData_DecodeSigEntry( + memcpy(pResultMem, pConst->value+1, 4); + return; + default: + Crash("MetaData_GetConstant() Cannot handle value type: 0x%02x", pConst->type); + } + +} + +void MetaData_GetHeapRoots(tHeapRoots *pHeapRoots, tMetaData *pMetaData) { + U32 i, top; + // Go through all types, getting their static variables. + + top = pMetaData->tables.numRows[MD_TABLE_TYPEDEF]; + for (i=1; i<=top; i++) { + tMD_TypeDef *pTypeDef; + + pTypeDef = (tMD_TypeDef*)MetaData_GetTableRow(pMetaData, MAKE_TABLE_INDEX(MD_TABLE_TYPEDEF, i)); + if (pTypeDef->isGenericDefinition) { + Generic_GetHeapRoots(pHeapRoots, pTypeDef); + } else { + if (pTypeDef->staticFieldSize > 0) { + Heap_SetRoots(pHeapRoots, pTypeDef->pStaticFields, pTypeDef->staticFieldSize); + } + } + } +} \ No newline at end of file diff --git a/dna/MetaData.h b/dna/MetaData.h new file mode 100644 index 0000000..adfa305 --- /dev/null +++ b/dna/MetaData.h @@ -0,0 +1,197 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__METADATA_H) +#define __METADATA_H + +#include "Types.h" +#include "RVA.h" + +#define MAX_TABLES 48 + +struct tMetaDataStrings_ { + // The start of the string heap + unsigned char *pStart; +}; +typedef struct tMetaDataStrings_ tMetaDataStrings; + +struct tMetaDataBlobs_ { + // The start of the blob heap + unsigned char *pStart; +}; +typedef struct tMetaDataBlobs_ tMetaDataBlobs; + +struct tMetaDataUserStrings_ { + // The start of the user string heap + unsigned char *pStart; +}; +typedef struct tMetaDataUserStrings_ tMetaDataUserStrings; + +struct tMetaDataGUIDs_ { + // The total number of GUIDs + unsigned int numGUIDs; + // Pointer to the first GUID + unsigned char *pGUID1; +}; +typedef struct tMetaDataGUIDs_ tMetaDataGUIDs; + +typedef struct tTables_ tTables; +struct tTables_ { + // The number of rows in each table + unsigned int numRows[MAX_TABLES]; + // The table data itself. 64 pointers to table data + // See MetaDataTables.h for each table structure + void* data[MAX_TABLES]; + + // Should each coded index lookup type use 16 or 32 bit indexes? + unsigned char codedIndex32Bit[13]; +}; + +typedef struct tMetaData_ tMetaData; +struct tMetaData_ { + tMetaDataStrings strings; + tMetaDataBlobs blobs; + tMetaDataUserStrings userStrings; + tMetaDataGUIDs GUIDs; + tTables tables; + + unsigned char index32BitString, index32BitBlob, index32BitGUID; +}; + +#define TYPEATTRIBUTES_INTERFACE 0x20 + +#define METHODATTRIBUTES_STATIC 0x10 +#define METHODATTRIBUTES_VIRTUAL 0x40 +#define METHODATTRIBUTES_NEWSLOT 0x100 +#define METHODATTRIBUTES_PINVOKEIMPL 0x2000 + +#define METHODIMPLATTRIBUTES_CODETYPE_MASK 0x3 +#define METHODIMPLATTRIBUTES_CODETYPE_RUNTIME 0x3 +#define METHODIMPLATTRIBUTES_INTERNALCALL 0x1000 + +#define FIELDATTRIBUTES_STATIC 0x10 +#define FIELDATTRIBUTES_LITERAL 0x40 // compile-time constant +#define FIELDATTRIBUTES_HASFIELDRVA 0x100 + +#define SIG_METHODDEF_GENERIC 0x10 +#define SIG_METHODDEF_HASTHIS 0x20 + +#define IMPLMAP_FLAGS_CHARSETMASK 0x0006 +#define IMPLMAP_FLAGS_CHARSETNOTSPEC 0x0000 +#define IMPLMAP_FLAGS_CHARSETANSI 0x0002 +#define IMPLMAP_FLAGS_CHARSETUNICODE 0x0004 +#define IMPLMAP_FLAGS_CHARSETAUTO 0x0006 + +#define TYPE_ISARRAY(pType) ((pType)->pArrayElementType != NULL) +#define TYPE_ISINTERFACE(pType) ((pType)->flags & TYPEATTRIBUTES_INTERFACE) +#define TYPE_ISGENERICINSTANCE(pType) ((pType)->pGenericDefinition != NULL) + +#define METHOD_ISVIRTUAL(pMethod) ((pMethod)->flags & METHODATTRIBUTES_VIRTUAL) +#define METHOD_ISSTATIC(pMethod) ((pMethod)->flags & METHODATTRIBUTES_STATIC) +#define METHOD_ISNEWSLOT(pMethod) ((pMethod)->flags & METHODATTRIBUTES_NEWSLOT) + +#define FIELD_HASFIELDRVA(pField) ((pField)->flags & FIELDATTRIBUTES_HASFIELDRVA) +#define FIELD_ISLITERAL(pField) ((pField)->flags & FIELDATTRIBUTES_LITERAL) +#define FIELD_ISSTATIC(pField) ((pField)->flags & FIELDATTRIBUTES_STATIC) + +#define IMPLMAP_ISCHARSET_NOTSPEC(pImplMap) (((pImplMap)->mappingFlags & IMPLMAP_FLAGS_CHARSETMASK) == IMPLMAP_FLAGS_CHARSETNOTSPEC) +#define IMPLMAP_ISCHARSET_ANSI(pImplMap) (((pImplMap)->mappingFlags & IMPLMAP_FLAGS_CHARSETMASK) == IMPLMAP_FLAGS_CHARSETANSI) +#define IMPLMAP_ISCHARSET_UNICODE(pImplMap) (((pImplMap)->mappingFlags & IMPLMAP_FLAGS_CHARSETMASK) == IMPLMAP_FLAGS_CHARSETUNICODE) +#define IMPLMAP_ISCHARSET_AUTO(pImplMap) (((pImplMap)->mappingFlags & IMPLMAP_FLAGS_CHARSETMASK) == IMPLMAP_FLAGS_CHARSETAUTO) + +#define TABLE_ID(index) ((index) >> 24) +#define TABLE_OFS(index) ((index) & 0x00ffffff) +#define MAKE_TABLE_INDEX(table, index) ((IDX_TABLE)(((table) << 24) | ((index) & 0x00ffffff))) + +typedef struct tParameter_ tParameter; +typedef struct tInterfaceMap_ tInterfaceMap; + +#include "MetaDataTables.h" + +struct tParameter_ { + // The type of the parameter + tMD_TypeDef *pTypeDef; + // The offset for this parameter into the paramater stack (in bytes) + U32 offset; + // The size of this value on the parameter stack (in bytes) + U32 size; +}; + +struct tInterfaceMap_ { + // The interface this is implementing + tMD_TypeDef *pInterface; + // The vTable for this interface implementation + U32 *pVTableLookup; + // The direct method table for this interface. This is only used for special auto-generated interfaces + tMD_MethodDef **ppMethodVLookup; +}; + +// static functions +void MetaData_Init(); +unsigned int MetaData_DecodeSigEntry(SIG *pSig); +IDX_TABLE MetaData_DecodeSigEntryToken(SIG *pSig); +unsigned int MetaData_DecodeHeapEntryLength(unsigned char **ppHeapEntry); + +void MetaData_GetHeapRoots(tHeapRoots *pHeapRoots, tMetaData *pMetaData); + +// Meta-data filling extra information + +#define MetaData_Fill_TypeDef(pTypeDef, ppClassTypeArgs, ppMethodTypeArgs) if ((pTypeDef)->isFilled == 0) MetaData_Fill_TypeDef_(pTypeDef, ppClassTypeArgs, ppMethodTypeArgs) +void MetaData_Fill_TypeDef_(tMD_TypeDef *pTypeDef, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs); +void MetaData_Fill_FieldDef(tMD_TypeDef *pParentType, tMD_FieldDef *pFieldDef, U32 memOffset, tMD_TypeDef **ppClassTypeArgs); +void MetaData_Fill_MethodDef(tMD_TypeDef *pParentType, tMD_MethodDef *pMethodDef, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs); + +// Meta-data searching + +U32 MetaData_CompareNameAndSig(STRING name, BLOB_ sigBlob, tMetaData *pSigMetaData, tMD_TypeDef **ppSigClassTypeArgs, tMD_TypeDef **ppSigMethodTypeArgs, tMD_MethodDef *pMethod, tMD_TypeDef **ppMethodClassTypeArgs, tMD_TypeDef **ppMethodMethodTypeArgs); + +tMetaData* MetaData_GetResolutionScopeMetaData(tMetaData *pMetaData, IDX_TABLE resolutionScopeToken, tMD_TypeDef **ppInNestedType); + +PTR MetaData_GetTypeMethodField(tMetaData *pMetaData, IDX_TABLE token, U32 *pObjectType, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs); + +tMD_TypeDef* MetaData_GetTypeDefFromName(tMetaData *pMetaData, STRING nameSpace, STRING name, tMD_TypeDef *pInNestedClass); +tMD_TypeDef* MetaData_GetTypeDefFromFullName(STRING assemblyName, STRING nameSpace, STRING name); +tMD_TypeDef* MetaData_GetTypeDefFromDefRefOrSpec(tMetaData *pMetaData, IDX_TABLE token, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs); +tMD_TypeDef* MetaData_GetTypeDefFromMethodDef(tMD_MethodDef *pMethodDef); +tMD_TypeDef* MetaData_GetTypeDefFromFieldDef(tMD_FieldDef *pFieldDef); + +tMD_MethodDef* MetaData_GetMethodDefFromDefRefOrSpec(tMetaData *pMetaData, IDX_TABLE token, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs); + +tMD_FieldDef* MetaData_GetFieldDefFromDefOrRef(tMetaData *pMetaData, IDX_TABLE token, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs); + +tMD_ImplMap* MetaData_GetImplMap(tMetaData *pMetaData, IDX_TABLE memberForwardedToken); +STRING MetaData_GetModuleRefName(tMetaData *pMetaData, IDX_TABLE memberRefToken); + +// instance functions +tMetaData* MetaData(); +void MetaData_LoadStrings(tMetaData *pThis, void *pStream, unsigned int streamLen); +void MetaData_LoadBlobs(tMetaData *pThis, void *pStream, unsigned int streamLen); +void MetaData_LoadUserStrings(tMetaData *pThis, void *pStream, unsigned int streamLen); +void MetaData_LoadGUIDs(tMetaData *pThis, void *pStream, unsigned int streamLen); +void MetaData_LoadTables(tMetaData *pThis, tRVA *pRVA, void *pStream, unsigned int streamLen); + +PTR MetaData_GetBlob(BLOB_ blob, U32 *pBlobLength); +STRING2 MetaData_GetUserString(tMetaData *pThis, IDX_USERSTRINGS index, unsigned int *pStringLength); + +void* MetaData_GetTableRow(tMetaData *pThis, IDX_TABLE index); + +void MetaData_GetConstant(tMetaData *pThis, IDX_TABLE idx, PTR pResultMem); + +#endif diff --git a/dna/MetaDataTables.h b/dna/MetaDataTables.h new file mode 100644 index 0000000..5ec4494 --- /dev/null +++ b/dna/MetaDataTables.h @@ -0,0 +1,563 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__METADATATABLES_H) +#define __METADATATABLES_H + +// Forward typedef's (anything used in MetaData.h must be here) +typedef struct tMD_MethodDef_ tMD_MethodDef; +typedef struct tMD_FieldDef_ tMD_FieldDef; +typedef struct tMD_TypeDef_ tMD_TypeDef; +typedef struct tMD_MethodSpec_ tMD_MethodSpec; +typedef struct tMD_ImplMap_ tMD_ImplMap; + +#include "Types.h" +#include "JIT.h" +#include "MetaData.h" +#include "Generics.h" + +// First, the combined tables + +typedef struct tMDC_ToFieldDef_ tMDC_ToFieldDef; +struct tMDC_ToFieldDef_ { + tMD_FieldDef *pFieldDef; +}; + +typedef struct tMDC_ToMethodDef_ tMDC_ToMethodDef; +struct tMDC_ToMethodDef_ { + tMD_MethodDef *pMethodDef; +}; + +typedef struct tMDC_ToTypeDef_ tMDC_ToTypeDef; +struct tMDC_ToTypeDef_ { + tMD_TypeDef *pTypeDef; +}; + + +// Second, the raw metadata tables + +// Table 0x00 - Module +struct tMD_Module_ { + // Module name - index into string heap + STRING name; + // GUID for module version - index into GUID heap + GUID_ mvID; +}; +typedef struct tMD_Module_ tMD_Module; + +// Table 0x01 - TypeRef +struct tMD_TypeRef_ { + // Combined + tMD_TypeDef *pTypeDef; + + // Table index into various tables + IDX_TABLE resolutionScope; + // Name of type ref - index into string heap + STRING name; + // Namespace of type ref - index into string heap + STRING nameSpace; +}; +typedef struct tMD_TypeRef_ tMD_TypeRef; +#define MD_TABLE_TYPEREF 0x01 + +// Table 0x02 - TypeDef +struct tMD_TypeDef_ { + // Combined + tMD_TypeDef *pTypeDef; + // MetaData pointer + tMetaData *pMetaData; + + // Type attribute flags + FLAGS32 flags; + // Name of type def - index into string heap + STRING name; + // Namespace of type def - index into string heap + STRING nameSpace; + // The type that this type extends (inherits from) + IDX_TABLE extends; + // The first entry in the Field table of the fields of this type def + IDX_TABLE fieldList; + // The first entry in the Method table of the methods of this type def + IDX_TABLE methodList; + + // Has this entry had its extended info filled? + U8 isFilled; + // Is this the last entry in this table? + U8 isLast; + // Is this a value type? + U8 isValueType; + // The type of evaluation stack entry needed for this type + U8 stackType; + // Total memory size of instances of this type (its in-memory representation) (not static fields) + U32 instanceMemSize; + // The parent type definition + tMD_TypeDef *pParent; + // The virtual method table + tMD_MethodDef **pVTable; + // The number of virtual methods in the vTable + U32 numVirtualMethods; + // Pointer to the memory for any static fields in this type. This will be NULL if type has no static fields + PTR pStaticFields; + // Has the static constructor been executed yet? + U8 isTypeInitialised; + // Is this a generic definition (a generic core type)? + U8 isGenericDefinition; + // Is this TypeDef primed - this means that: + // numPrimedFields, numPrimedMethods, numVirtualMethods + // have been pre-set. + U8 isPrimed; + // padding + U8 padding0[1]; + // If this type has a static constructor, then store it here. NULL if no static constructor + tMD_MethodDef *pStaticConstructor; + // The size of this type when in an array + U32 arrayElementSize; + // The size of this type when on the stack (or in a field) + U32 stackSize; + // How many interfaces does this type implement + U32 numInterfaces; + // All interfaces that this type implements are mapped here + tInterfaceMap *pInterfaceMaps; + // The original table index of this TypeDef + IDX_TABLE tableIndex; + // If this is a generic type definition, then store any instantiatations here (in a linked list) + tGenericInstance *pGenericInstances; + // If this is a generic instance, then store link to its core definition type + tMD_TypeDef *pGenericDefinition; + // If this is a generic instance, then store the class type args + tMD_TypeDef **ppClassTypeArgs; + // If this type is System.Array, then this stores the element type + tMD_TypeDef *pArrayElementType; + // The number of fields in this type. This includes and static fields, but not inherited fields + U32 numFields; + // Links to all the fields (in memory order), including statics (not inherited) + tMD_FieldDef **ppFields; + // The memory needed for static fields, in bytes + U32 staticFieldSize; + // The number of methods in this type. This includes static methods, but not inherited methods + U32 numMethods; + // Links to all method in this type, including statics, not inherited + tMD_MethodDef **ppMethods; + // If this is a nested class, this records which type it is nested within. + tMD_TypeDef *pNestedIn; + // If this type has a finalizer, point to it here + tMD_MethodDef *pFinalizer; + // Pointer to the heap object which is the Type class object for this type. + // This is only allocated as needed, so defaults to NULL + HEAP_PTR typeObject; +}; +#define MD_TABLE_TYPEDEF 0x02 + +struct tMD_FieldDef_ { + // Combined + tMD_FieldDef *pFieldDef; + // MetaData pointer + tMetaData *pMetaData; + + // Flags - FieldAttributes + FLAGS16 flags; + // Padding dummy entry + I16 padding0; + // Name of the field + STRING name; + // Signature of the field + BLOB_ signature; + + // The type of this field + tMD_TypeDef *pType; + // The type that contains this field + tMD_TypeDef *pParentType; + // The field offset within its containing type + U32 memOffset; + // The size in bytes that this field takes up in the memory representation + U32 memSize; + // The original table index of this FieldDef + IDX_TABLE tableIndex; + // If this is a static field, then the absolute address of this field is stored here. + // If this field has an RVA, then the pointer to the memory location is stored here. + // If this is a literal field, then this is a pointer to the tMD_Constant literal definition. + PTR pMemory; +}; +#define MD_TABLE_FIELDDEF 0x04 + +// Table 0x06 - MethodDef +struct tMD_MethodDef_ { + // Combined + tMD_MethodDef *pMethodDef; + // MetaData pointer + tMetaData *pMetaData; + + // RVA converted to pointer. Code for this method + U8 *pCIL; + // Flags - MethodImplAttributes + FLAGS16 implFlags; + // Flags - MethodAttribute + FLAGS16 flags; + // Name of method + STRING name; + // Signature of method + BLOB_ signature; + // The first entry in the Param table of the parameters of this method def + IDX_TABLE paramList; + + // If this method has been JITted, then this points to it + tJITted *pJITted; + // Has the extra infomation in this method been filled in yet? + U8 isFilled; + // Set true if this method has generic parameters + U8 isGenericDefinition; + // The number of parameters for this method. This includes the 'this' parameter if non-static method + U16 numberOfParameters; + // The parameter information for this method, including the 'this' parameter if non-static method + tParameter *pParams; + // The size in bytes needed for the parameters, including the 'this' parameter if non-static method + U32 parameterStackSize; + // The method return type + tMD_TypeDef *pReturnType; + // The type that this method is a part of + tMD_TypeDef *pParentType; + // The original table index of this MethodDef + IDX_TABLE tableIndex; + // If this is a virtual method then this contains the offset into the vTable for this method. + // This offset is the table index - not the byte offset. + U32 vTableOfs; + // If this is method has generic parameters, then store the method type args + tMD_TypeDef **ppMethodTypeArgs; + // If this is a generic core method, then store type instances here. + tGenericMethodInstance *pGenericMethodInstances; + +#ifdef GEN_COMBINED_OPCODES + // The number of times this method is on the call stack of all threads + U32 callStackCount; + // The number of times this method has been called + U64 genCallCount; + // Pointer to the method that has the next highest number of calls + tMD_MethodDef *pNextHighestCalls; + // Pointer to the method that has the prev highest number of calls + tMD_MethodDef *pPrevHighestCalls; + // If this method currently has a combined opcode JIT version, then point to it here. + tJITted *pJITtedCombined; +#endif + +#ifdef DIAG_METHOD_CALLS + // Number of times this method has been called + U32 callCount; + // Total time (inclusive of children) in this function + U64 totalTime; +#endif +}; +#define MD_TABLE_METHODDEF 0x06 + +// Table 0x08 - Param +#define MD_TABLE_PARAM 0x08 +typedef struct tMD_Param_ tMD_Param; +struct tMD_Param_ { + // Flags - ParamAttributes + FLAGS16 flags; + // The sequence number of the parameter. 0 is the return value, 1+ are the parameters + U16 sequence; + // The name of the parameter (optional) + STRING name; +}; + +// Table 0x09 - InterfaceImpl +#define MD_TABLE_INTERFACEIMPL 0x09 +typedef struct tMD_InterfaceImpl_ tMD_InterfaceImpl; +struct tMD_InterfaceImpl_ { + // The class that implements... + IDX_TABLE class_; + // ...this interface + IDX_TABLE interface_; +}; + +// Table 0x0A - MemberRef +struct tMD_MemberRef_ { + // Combined + union { + tMD_MethodDef *pMethodDef; + tMD_FieldDef *pFieldDef; + } u; + + // Type of member, coded index: MemberRefParent + IDX_TABLE class_; + // Name of the member + STRING name; + // Signature of the member + BLOB_ signature; +}; +typedef struct tMD_MemberRef_ tMD_MemberRef; +#define MD_TABLE_MEMBERREF 0x0a + +// Table 0x0B - Constant +struct tMD_Constant_ { + // The ELEMENT_TYPE of the constant - 'void' is ELEMENT_TYPE_CLASS with a 0 blob index + U8 type; + // Padding + U8 padding0[3]; + // The parent of this constant - HasConstant encoded table index + IDX_TABLE parent; + // The value of the constant, index in the BLOB heap + BLOB_ value; +}; +typedef struct tMD_Constant_ tMD_Constant; +#define MD_TABLE_CONSTANT 0x0b + +// Table 0x0C - CustomAttribute +struct tMD_CustomAttribute_ { + // Parent + IDX_TABLE parent; + // Type + IDX_TABLE type; + // value of attribute + BLOB_ value; +}; +typedef struct tMD_CustomAttribute_ tMD_CustomAttribute; +#define MD_TABLE_CUSTOMATTRIBUTE 0x0c + +#define MD_TABLE_DECLSECURITY 0x0e +typedef struct tMD_DeclSecurity_ tMD_DeclSecurity; +struct tMD_DeclSecurity_ { + // The security action + U16 action; + // Padding + U16 padding0; + // The parent typedef, methoddef or assembly of this security info - HasDeclSecurity coded index + IDX_TABLE parent; + // The security permission set + BLOB_ permissionSet; +}; + +// Table 0x0F - ClassLayout +struct tMD_ClassLayout_ { + // The packing size + U16 packingSize; + // Padding + U16 padding0; + // The class size + U32 classSize; + // The parent TypeDef + IDX_TABLE parent; +}; +typedef struct tMD_ClassLayout_ tMD_ClassLayout; + +// Table 0x11 - StandAloneSig +struct tMD_StandAloneSig_ { + BLOB_ signature; +}; +typedef struct tMD_StandAloneSig_ tMD_StandAloneSig; + +// Table 0x12 - EventMap +struct tMD_EventMap_ { + // Index into TypeDef table + IDX_TABLE parent; + // Index into Event table. Marks the start of a continuous run of events owned by this type. + IDX_TABLE eventList; +}; +typedef struct tMD_EventMap_ tMD_EventMap; + +// Table 0x14 - Event +struct tMD_Event_ { + // Flags of type eventAttributes + FLAGS16 eventFlags; + // Padding + U16 padding0; + // The name of the event + STRING name; + // The type of this event. A TypeDefOrRef index. This is NOT the type to which this event belongs. + IDX_TABLE eventType; +}; +typedef struct tMD_Event_ tMD_Event; + +// Table 0x15 - PropertyMap +struct tMD_PropertyMap_ { + // Parent - index into TypeDef table + IDX_TABLE parent; + // PropertyList - index into Property table + IDX_TABLE propertyList; +}; +typedef struct tMD_PropertyMap tMD_PropertyMap; + +// Table 0x17 - Property +struct tMD_Property_ { + // Flags - PropertyAttributes + FLAGS16 flags; + // Padding dummy entry + I16 padding0; + // Name + STRING name; + // The type signature + BLOB_ typeSig; +}; +typedef struct tMD_Property_ tMD_Property; +#define MD_TABLE_PROPERTY 0x17 + +// Table 0x18 - MethodSemantics +struct tMD_MethodSemantics_ { + // semantics flags - MethodSemanticsAttributes + FLAGS16 semantics; + // Padding dummy entry + I16 padding0; + // method - entry into MethodDef table + IDX_TABLE method; + // HasSemantics coded entry - index into Event or Property tables + IDX_TABLE association; +}; +typedef struct tMD_MethodSemantics_ tMD_MethodSemantics; +#define MD_TABLE_METHODSEMANTICS 0x18 + +// Table 0x19 - MethodImpl +#define MD_TABLE_METHODIMPL 0x19 +typedef struct tMD_MethodImpl_ tMD_MethodImpl; +struct tMD_MethodImpl_ { + // Index into TypeDef table + IDX_TABLE class_; + // The method to use as the interface implementation. Coded index MethodDefOrRef + IDX_TABLE methodBody; + // The method declaration that is being overriden. Coded index MethodDefOrRef + IDX_TABLE methodDeclaration; +}; + +#define MD_TABLE_MODULEREF 0x1a +typedef struct tMD_ModuleRef_ tMD_ModuleRef; +struct tMD_ModuleRef_ { + // The module name referenced + STRING name; +}; + +// Table 0x1B - TypeSpec +#define MD_TABLE_TYPESPEC 0x1b +typedef struct tMD_TypeSpec_ tMD_TypeSpec; +struct tMD_TypeSpec_ { + // Combined + tMD_TypeDef *pTypeDef; + // MetaData pointer + tMetaData *pMetaData; + + // The signature of the type + BLOB_ signature; +}; + +#define MD_TABLE_IMPLMAP 0x1c +struct tMD_ImplMap_ { + // Mapping flags of type PInvokeAttributes + U16 mappingFlags; + // padding + U16 padding; + // A MemberForwarded coded index, specifying which member is forwarded. Note that only members are allowed. + IDX_TABLE memberForwarded; + // The import name + STRING importName; + // The module ref (scope) of the import + IDX_TABLE importScope; +}; + +// Table 0x1D - FieldRVA +struct tMD_FieldRVA_ { + // The RVA of the initial data for the field + U32 rva; + // Index into the field table + IDX_TABLE field; +}; +typedef struct tMD_FieldRVA_ tMD_FieldRVA; +#define MD_TABLE_FIELDRVA 0x1d + +// Table 0x20 - Assembly +struct tMD_Assembly_ { + // Hash algorithm ID of type AssemblyHashAlgorithm + U32 hashAlgID; + // Version info + U16 majorVersion, minorVersion, buildNumber, revisionNumber; + // Flags - AssemblyFlags + FLAGS32 flags; + // Public key + BLOB_ publicKey; + // Name + STRING name; + // Culture + STRING culture; +}; +typedef struct tMD_Assembly_ tMD_Assembly; +#define MD_TABLE_ASSEMBLY 0x20 + +struct tMD_AssemblyRef_ { + // Version info + U16 majorVersion, minorVersion, buildNumber, revisionNumber; + // Flags - AssemblyFlags + FLAGS32 flags; + // Public key or token + BLOB_ publicKeyOrToken; + // Name + STRING name; + // Culture + STRING culture; + // Hash value + BLOB_ hashValue; +}; +typedef struct tMD_AssemblyRef_ tMD_AssemblyRef; +#define MD_TABLE_ASSEMBLYREF 0x23 + +typedef struct tMD_NestedClass_ tMD_NestedClass; +struct tMD_NestedClass_ { + // The TypeDef of the class that is nested + IDX_TABLE nestedClass; + // The TypeDef of the class in which nestedClass is enclosed + IDX_TABLE enclosingClass; +}; +#define MD_TABLE_NESTEDCLASS 0x29 + +// Table 0x2A - Generic param +#define MD_TABLE_GENERICPARAM 0x2A +typedef struct tMD_GenericParam_ tMD_GenericParam; +struct tMD_GenericParam_ { + // The number of this generic parameter. Numbered left-to-right, starting from 0 + U16 number; + // Flags - GenericParamAttributes + FLAGS16 flags; + // Owner - the TypeDef or MethodDef that owns this parameter - TypeOrMethodDef coded index + IDX_TABLE owner; + // The name of the parameter + STRING name; +}; + +// Table 0x2B - MethodSpec +#define MD_TABLE_METHODSPEC 0x2B +struct tMD_MethodSpec_ { + // Combined + tMD_MethodDef *pMethodDef; + // MetaData pointer + tMetaData *pMetaData; + + // Index into MethodDef or MethodRef specifying which method this spec refers to + IDX_TABLE method; + // Index into blob heap, holding the signature of this instantiation + BLOB_ instantiation; +}; + +// Table 0x2C - GenericParamConstraint +#define MD_TABLE_GENERICPARAMCONSTRAINT 0x2C +typedef struct tMD_GenericParamConstraint_ tMD_GenericParamConstraint; +struct tMD_GenericParamConstraint_ { + // The generic param that this constraint applies to + tMD_GenericParam *pGenericParam; + // The type of the constraint (coded index TypeDefOrRef) + IDX_TABLE constraint; +}; + +#endif diff --git a/dna/MetaData_Fill.c b/dna/MetaData_Fill.c new file mode 100644 index 0000000..4b0543b --- /dev/null +++ b/dna/MetaData_Fill.c @@ -0,0 +1,491 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "MetaData.h" +#include "CLIFile.h" +#include "Type.h" +#include "EvalStack.h" + +void MetaData_Fill_FieldDef(tMD_TypeDef *pParentType, tMD_FieldDef *pFieldDef, U32 memOffset, tMD_TypeDef **ppClassTypeArgs) { + U32 sigLength; + PTR sig; + tMetaData *pMetaData; + + pFieldDef->pParentType = pParentType; + + sig = MetaData_GetBlob(pFieldDef->signature, &sigLength); + + MetaData_DecodeSigEntry(&sig); // First entry always 0x06 + pFieldDef->pType = Type_GetTypeFromSig(pFieldDef->pMetaData, &sig, ppClassTypeArgs, NULL); + if (pFieldDef->pType == NULL) { + // If the field is a core generic type definition, then we can't do anything more + return; + } + MetaData_Fill_TypeDef(pFieldDef->pType, NULL, NULL); + // A check for 0 is done so if a type has a field of it's own type it is handled correctly. + pFieldDef->memSize = (pFieldDef->pType->stackSize>0)?pFieldDef->pType->stackSize:sizeof(void*); + pFieldDef->memOffset = memOffset; + pFieldDef->pFieldDef = pFieldDef; + + pMetaData = pFieldDef->pMetaData; + if (FIELD_HASFIELDRVA(pFieldDef)) { + U32 i, top; + + // Field has RVA, so load it from FieldRVA + top = pMetaData->tables.numRows[MD_TABLE_FIELDRVA]; + for (i=1; i<=top; i++) { + tMD_FieldRVA *pFieldRVA; + + pFieldRVA = (tMD_FieldRVA*)MetaData_GetTableRow(pMetaData, MAKE_TABLE_INDEX(MD_TABLE_FIELDRVA, i)); + if (pFieldRVA->field == pFieldDef->tableIndex) { + pFieldDef->pMemory = (PTR)pFieldRVA->rva; + break; + } + } + } else if (FIELD_ISLITERAL(pFieldDef)) { + // Field is literal, so make pMemory point to the value signature + U32 i, top; + + top = pMetaData->tables.numRows[MD_TABLE_CONSTANT]; + for (i=1; i<=top; i++) { + tMD_Constant *pConst; + pConst = (tMD_Constant*)MetaData_GetTableRow(pMetaData, MAKE_TABLE_INDEX(MD_TABLE_CONSTANT, i)); + if (pConst->parent == pFieldDef->tableIndex) { + // Found the field + pFieldDef->pMemory = (PTR)pConst; + break; + } + } + } +} + +void MetaData_Fill_MethodDef(tMD_TypeDef *pParentType, tMD_MethodDef *pMethodDef, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs) { + SIG sig; + U32 i, entry, totalSize; + + pMethodDef->pParentType = pParentType; + pMethodDef->pMethodDef = pMethodDef; + pMethodDef->isFilled = 1; + + if (pMethodDef->isGenericDefinition) { + // Generic definition method, so can't do any more. + //log_f("Method<>: %s.%s.%s()\n", pParentType->nameSpace, pParentType->name, pMethodDef->name); + return; + } + + sig = MetaData_GetBlob(pMethodDef->signature, NULL); + entry = MetaData_DecodeSigEntry(&sig); + if (entry & SIG_METHODDEF_GENERIC) { + // Has generic parameters. Read how many, but don't care about the answer + MetaData_DecodeSigEntry(&sig); + } + pMethodDef->numberOfParameters = MetaData_DecodeSigEntry(&sig) + (METHOD_ISSTATIC(pMethodDef)?0:1); + pMethodDef->pReturnType = Type_GetTypeFromSig(pMethodDef->pMetaData, &sig, ppClassTypeArgs, ppMethodTypeArgs); + if (pMethodDef->pReturnType != NULL) { + MetaData_Fill_TypeDef(pMethodDef->pReturnType, NULL, NULL); + } + pMethodDef->pParams = (tParameter*)malloc(pMethodDef->numberOfParameters * sizeof(tParameter)); + totalSize = 0; + if (!METHOD_ISSTATIC(pMethodDef)) { + // Fill in parameter info for the 'this' pointer + pMethodDef->pParams->offset = 0; + if (pParentType->isValueType) { + // If this is a value-type then the 'this' pointer is actually an IntPtr to the value-type's location + pMethodDef->pParams->size = 4; + pMethodDef->pParams->pTypeDef = types[TYPE_SYSTEM_INTPTR]; + } else { + pMethodDef->pParams->size = 4; + pMethodDef->pParams->pTypeDef = pParentType; + } + totalSize = 4; + } + for (i=totalSize>>2; inumberOfParameters; i++) { + tMD_TypeDef *pTypeDef; + U32 size; + + pTypeDef = Type_GetTypeFromSig(pMethodDef->pMetaData, &sig, ppClassTypeArgs, ppMethodTypeArgs); + //if (pTypeDef != NULL) { + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + size = pTypeDef->stackSize; + //} else { + // // If this method has generic-type-argument arguments, then we can't do anything very sensible yet + // size = 0; + //} + pMethodDef->pParams[i].pTypeDef = pTypeDef; + pMethodDef->pParams[i].offset = totalSize; + pMethodDef->pParams[i].size = size; + totalSize += size; + } + pMethodDef->parameterStackSize = totalSize; +} + +// Find the method that has been overridden by pMethodDef. +// This is to get the correct vTable offset for the method. +// This must search the MethodImpl table to see if the default inheritence rules are being overridden. +// Return NULL if this method does not override anything. +static tMD_MethodDef* FindVirtualOverriddenMethod(tMD_TypeDef *pTypeDef, tMD_MethodDef *pMethodDef) { + U32 i; + + do { + // Search MethodImpl table + for (i=pTypeDef->pMetaData->tables.numRows[MD_TABLE_METHODIMPL]; i>0; i--) { + tMD_MethodImpl *pMethodImpl; + + pMethodImpl = (tMD_MethodImpl*)MetaData_GetTableRow(pTypeDef->pMetaData, MAKE_TABLE_INDEX(MD_TABLE_METHODIMPL, i)); + if (pMethodImpl->class_ == pTypeDef->tableIndex) { + tMD_MethodDef *pMethodDeclDef; + + pMethodDeclDef = MetaData_GetMethodDefFromDefRefOrSpec(pTypeDef->pMetaData, pMethodImpl->methodDeclaration, pTypeDef->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs); + if (pMethodDeclDef->tableIndex == pMethodDef->tableIndex) { + IDX_TABLE methodToken; + tMD_MethodDef *pMethod; + + methodToken = pMethodImpl->methodBody; + pMethod = (tMD_MethodDef*)MetaData_GetTableRow(pTypeDef->pMetaData, methodToken); + return pMethod; + } + } + } + + // Use normal inheritence rules + // It must be a virtual method that's being overridden. + for (i=pTypeDef->numVirtualMethods - 1; i != 0xffffffff; i--) { + if (MetaData_CompareNameAndSig(pMethodDef->name, pMethodDef->signature, pMethodDef->pMetaData, pMethodDef->pParentType->ppClassTypeArgs, pMethodDef->ppMethodTypeArgs, pTypeDef->pVTable[i], pTypeDef->ppClassTypeArgs, NULL)) { + return pTypeDef->pVTable[i]; + } + } + pTypeDef = pTypeDef->pParent; + } while (pTypeDef != NULL); + + return NULL; +} + +void MetaData_Fill_TypeDef_(tMD_TypeDef *pTypeDef, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs) { + IDX_TABLE firstIdx, lastIdx, token; + U32 instanceMemSize, staticMemSize, virtualOfs, i, j; + tMetaData *pMetaData; + tMD_TypeDef *pParent; + + pMetaData = pTypeDef->pMetaData; + pTypeDef->isFilled = 1; + pTypeDef->pTypeDef = pTypeDef; + + pTypeDef->pParent = MetaData_GetTypeDefFromDefRefOrSpec(pMetaData, pTypeDef->extends, ppClassTypeArgs, ppMethodTypeArgs); + pParent = pTypeDef->pParent; + + if (pParent != NULL) { + MetaData_Fill_TypeDef(pParent, NULL, NULL); + virtualOfs = pParent->numVirtualMethods; + } else { + virtualOfs = 0; + } + pTypeDef->isValueType = (U8)Type_IsValueType(pTypeDef); + + // If not primed, then work out how many methods & fields there are. + if (!pTypeDef->isPrimed) { + // Methods + lastIdx = (pTypeDef->isLast)? + MAKE_TABLE_INDEX(MD_TABLE_METHODDEF, pTypeDef->pMetaData->tables.numRows[MD_TABLE_METHODDEF]): + (pTypeDef[1].methodList - 1); + pTypeDef->numMethods = lastIdx - pTypeDef->methodList + 1; + // Fields + lastIdx = (pTypeDef->isLast)? + MAKE_TABLE_INDEX(MD_TABLE_FIELDDEF, pTypeDef->pMetaData->tables.numRows[MD_TABLE_FIELDDEF]): + (pTypeDef[1].fieldList - 1); + pTypeDef->numFields = lastIdx - pTypeDef->fieldList + 1; + } + + // Must create the virtual method table BEFORE any other type resolution is done + // Note that this must not do ANY filling of types or methods. + // This is to ensure that the parent object(s) in any type inheritance hierachy are allocated + // their virtual method offset before derived types. + firstIdx = pTypeDef->methodList; + lastIdx = firstIdx + pTypeDef->numMethods - 1; + // This only needs to be done for non-generic types, or for generic types that are not a definition + // I.e. Fully instantiated generic types + if (!pTypeDef->isGenericDefinition) { + for (token = firstIdx; token <= lastIdx; token++) { + tMD_MethodDef *pMethodDef; + + pMethodDef = MetaData_GetMethodDefFromDefRefOrSpec(pMetaData, token, ppClassTypeArgs, ppMethodTypeArgs); + + // This is needed, so array resolution can work correctly and FindVirtualOverriddenMethod() can work. + pMethodDef->pParentType = pTypeDef; + + if (METHOD_ISVIRTUAL(pMethodDef)) { + if (METHOD_ISNEWSLOT(pMethodDef) || pTypeDef->pParent == NULL) { + // Allocate a new vTable slot if method is explicitly marked as NewSlot, or + // this is of type Object. + pMethodDef->vTableOfs = virtualOfs++; + } else { + tMD_MethodDef *pVirtualOveriddenMethod; + + pVirtualOveriddenMethod = FindVirtualOverriddenMethod(pTypeDef->pParent, pMethodDef); + Assert(pVirtualOveriddenMethod != NULL); + pMethodDef->vTableOfs = pVirtualOveriddenMethod->vTableOfs; + } + } else { + // Dummy value - make it obvious it's not valid! + pMethodDef->vTableOfs = 0xffffffff; + } + + } + // Create the virtual method table + pTypeDef->numVirtualMethods = virtualOfs; + + // Resolve fields, members, interfaces. + // Only needs to be done if it's not a generic definition type + + // It it's not a value-type and the stack-size is not preset, then set it up now. + // It needs to be done here as non-static fields in non-value types can point to the containing type + if (pTypeDef->stackSize == 0 && !pTypeDef->isValueType) { + pTypeDef->stackType = EVALSTACK_O; + pTypeDef->stackSize = sizeof(void*); + } + // Resolve all fields - instance ONLY at this point, + // because static fields in value-types can be of the containing type, and the size is not yet known. + firstIdx = pTypeDef->fieldList; + lastIdx = firstIdx + pTypeDef->numFields - 1; + staticMemSize = 0; + if (pTypeDef->numFields > 0) { + pTypeDef->ppFields = mallocForever(pTypeDef->numFields * sizeof(tMD_FieldDef*)); + } + instanceMemSize = (pTypeDef->pParent == NULL)?0:pTypeDef->pParent->instanceMemSize; + for (token = firstIdx, i=0; token <= lastIdx; token++, i++) { + tMD_FieldDef *pFieldDef; + + pFieldDef = MetaData_GetFieldDefFromDefOrRef(pMetaData, token, ppClassTypeArgs, ppMethodTypeArgs); + if (!FIELD_ISSTATIC(pFieldDef)) { + // Only handle non-static fields at the moment + if (pTypeDef->pGenericDefinition != NULL) { + // If this is a generic instantiation type, then all field defs need to be copied, + // as there will be lots of different instantiations. + tMD_FieldDef *pFieldCopy = TMALLOCFOREVER(tMD_FieldDef); + memcpy(pFieldCopy, pFieldDef, sizeof(tMD_FieldDef)); + pFieldDef = pFieldCopy; + } + if (FIELD_ISLITERAL(pFieldDef) || FIELD_HASFIELDRVA(pFieldDef)) { + // If it's a literal, then analyse the field, but don't include it in any memory allocation + // If is has an RVA, then analyse the field, but don't include it in any memory allocation + MetaData_Fill_FieldDef(pTypeDef, pFieldDef, 0, ppClassTypeArgs); + } else { + MetaData_Fill_FieldDef(pTypeDef, pFieldDef, instanceMemSize, ppClassTypeArgs); + instanceMemSize += pFieldDef->memSize; + } + pTypeDef->ppFields[i] = pFieldDef; + } + } + if (pTypeDef->instanceMemSize == 0) { + pTypeDef->instanceMemSize = instanceMemSize; + } + + // Sort out stack type and size. + // Note that this may already be set, as some basic types have this preset; + // or if it's not a value-type it'll already be set + if (pTypeDef->stackSize == 0) { + // if it gets here then it must be a value type + pTypeDef->stackType = EVALSTACK_VALUETYPE; + pTypeDef->stackSize = pTypeDef->instanceMemSize; + } + // Sort out array element size. Note that some basic types will have this preset. + if (pTypeDef->arrayElementSize == 0) { + pTypeDef->arrayElementSize = pTypeDef->stackSize; + } + + // Handle static fields + for (token = firstIdx, i=0; token <= lastIdx; token++, i++) { + tMD_FieldDef *pFieldDef; + + pFieldDef = MetaData_GetFieldDefFromDefOrRef(pMetaData, token, ppClassTypeArgs, ppMethodTypeArgs); + if (FIELD_ISSTATIC(pFieldDef)) { + // Only handle static fields here + if (pTypeDef->pGenericDefinition != NULL) { + // If this is a generic instantiation type, then all field defs need to be copied, + // as there will be lots of different instantiations. + tMD_FieldDef *pFieldCopy = TMALLOCFOREVER(tMD_FieldDef); + memcpy(pFieldCopy, pFieldDef, sizeof(tMD_FieldDef)); + pFieldDef = pFieldCopy; + } + if (FIELD_ISLITERAL(pFieldDef) || FIELD_HASFIELDRVA(pFieldDef)) { + // If it's a literal, then analyse the field, but don't include it in any memory allocation + // If is has an RVA, then analyse the field, but don't include it in any memory allocation + MetaData_Fill_FieldDef(pTypeDef, pFieldDef, 0, ppClassTypeArgs); + } else { + MetaData_Fill_FieldDef(pTypeDef, pFieldDef, staticMemSize, ppClassTypeArgs); + staticMemSize += pFieldDef->memSize; + } + pTypeDef->ppFields[i] = pFieldDef; + } + } + if (staticMemSize > 0) { + pTypeDef->pStaticFields = mallocForever(staticMemSize); + memset(pTypeDef->pStaticFields, 0, staticMemSize); + // Set the field addresses (->pMemory) of all static fields + for (i = 0; inumFields; i++) { + tMD_FieldDef *pFieldDef; + + pFieldDef = pTypeDef->ppFields[i]; + if (FIELD_ISSTATIC(pFieldDef) && pFieldDef->pMemory == NULL) { + // Only set it if it isn't already set. It will be already set if this field has an RVA + pFieldDef->pMemory = pTypeDef->pStaticFields + pFieldDef->memOffset; + } + } + pTypeDef->staticFieldSize = staticMemSize; + } + + // Resolve all members + firstIdx = pTypeDef->methodList; + lastIdx = firstIdx + pTypeDef->numMethods - 1; + pTypeDef->ppMethods = mallocForever(pTypeDef->numMethods * sizeof(tMD_MethodDef*)); + pTypeDef->pVTable = mallocForever(pTypeDef->numVirtualMethods * sizeof(tMD_MethodDef*)); + // Copy initial vTable from parent + if (pTypeDef->pParent != NULL) { + memcpy(pTypeDef->pVTable, pTypeDef->pParent->pVTable, pTypeDef->pParent->numVirtualMethods * sizeof(tMD_MethodDef*)); + } + for (token = firstIdx, i = 0; token <= lastIdx; token++, i++) { + tMD_MethodDef *pMethodDef; + + pMethodDef = MetaData_GetMethodDefFromDefRefOrSpec(pMetaData, token, ppClassTypeArgs, ppMethodTypeArgs); + if (pTypeDef->pGenericDefinition != NULL) { + // If this is a generic instantiation type, then all method defs need to be copied, + // as there will be lots of different instantiations. + tMD_MethodDef *pMethodCopy = TMALLOCFOREVER(tMD_MethodDef); + memcpy(pMethodCopy, pMethodDef, sizeof(tMD_MethodDef)); + pMethodDef = pMethodCopy; + } + if (METHOD_ISSTATIC(pMethodDef) && strcmp(pMethodDef->name, ".cctor") == 0) { + // This is a static constructor + pTypeDef->pStaticConstructor = pMethodDef; + } + if (!METHOD_ISSTATIC(pMethodDef) && pTypeDef->pParent != NULL && + strcmp(pMethodDef->name, "Finalize") == 0) { + // This is a Finalizer method, but not for Object. + // Delibrately miss out Object's Finalizer because it's empty and will cause every object + // of any type to have a Finalizer which will be terrible for performance. + pTypeDef->pFinalizer = pMethodDef; + } + if (METHOD_ISVIRTUAL(pMethodDef)) { + // This is a virtual method, so enter it in the vTable + pTypeDef->pVTable[pMethodDef->vTableOfs] = pMethodDef; + } + pTypeDef->ppMethods[i] = pMethodDef; + } + // Find inherited Finalizer, if this type doesn't have an explicit Finalizer, and if there is one + if (pTypeDef->pFinalizer == NULL) { + tMD_TypeDef *pInheritedType = pTypeDef->pParent; + while (pInheritedType != NULL) { + if (pInheritedType->pFinalizer != NULL) { + pTypeDef->pFinalizer = pInheritedType->pFinalizer; + break; + } + pInheritedType = pInheritedType->pParent; + } + } + // Fill all method definitions for this type + for (i=0; inumMethods; i++) { + MetaData_Fill_MethodDef(pTypeDef, pTypeDef->ppMethods[i], ppClassTypeArgs, ppMethodTypeArgs); + } + + // Map all interface method calls. This only needs to be done for Classes, not Interfaces + // And is not done for generic definitions. + if (!TYPE_ISINTERFACE(pTypeDef)) { + firstIdx = 0; + if (pTypeDef->pParent != NULL) { + j = pTypeDef->numInterfaces = pTypeDef->pParent->numInterfaces; + } else { + j = 0; + } + // TODO: Better to do this once during file load (the bit in this for loop) + for (i=1; i<=pMetaData->tables.numRows[MD_TABLE_INTERFACEIMPL]; i++) { + tMD_InterfaceImpl *pInterfaceImpl; + + pInterfaceImpl = (tMD_InterfaceImpl*)MetaData_GetTableRow(pMetaData, MAKE_TABLE_INDEX(MD_TABLE_INTERFACEIMPL, i)); + if (pInterfaceImpl->class_ == pTypeDef->tableIndex) { + // count how many interfaces are implemented + pTypeDef->numInterfaces++; + if (firstIdx == 0) { + firstIdx = MAKE_TABLE_INDEX(MD_TABLE_INTERFACEIMPL, i); + } + lastIdx = MAKE_TABLE_INDEX(MD_TABLE_INTERFACEIMPL, i); + } + } + if (pTypeDef->numInterfaces > 0 && !pTypeDef->isGenericDefinition) { + U32 mapNum; + + pTypeDef->pInterfaceMaps = (tInterfaceMap*)mallocForever(pTypeDef->numInterfaces * sizeof(tInterfaceMap)); + // Copy interface maps from parent type + if (j > 0) { + memcpy(pTypeDef->pInterfaceMaps, pTypeDef->pParent->pInterfaceMaps, j * sizeof(tInterfaceMap)); + } + mapNum = j; + if (firstIdx > 0) { + for (token=firstIdx; token<=lastIdx; token++, mapNum++) { + tMD_InterfaceImpl *pInterfaceImpl; + + pInterfaceImpl = (tMD_InterfaceImpl*)MetaData_GetTableRow(pMetaData, token); + if (pInterfaceImpl->class_ == pTypeDef->tableIndex) { + tMD_TypeDef *pInterface; + tInterfaceMap *pMap; + + // Get the interface that this type implements + pInterface = MetaData_GetTypeDefFromDefRefOrSpec(pMetaData, pInterfaceImpl->interface_, ppClassTypeArgs, ppMethodTypeArgs); + MetaData_Fill_TypeDef(pInterface, NULL, NULL); + pMap = &pTypeDef->pInterfaceMaps[mapNum]; + pMap->pInterface = pInterface; + pMap->pVTableLookup = (U32*)mallocForever(pInterface->numVirtualMethods * sizeof(U32)); + pMap->ppMethodVLookup = NULL; + // Discover interface mapping for each interface method + for (i=0; inumVirtualMethods; i++) { + tMD_MethodDef *pInterfaceMethod, *pOverriddenMethod; + + pInterfaceMethod = pInterface->pVTable[i]; + pOverriddenMethod = FindVirtualOverriddenMethod(pTypeDef, pInterfaceMethod); + Assert(pOverriddenMethod != NULL); + pMap->pVTableLookup[i] = pOverriddenMethod->vTableOfs; + } + } else { + Crash("Problem with interface class"); + } + } + } + } + } + + // If this is an enum type, then pretend its stack type is its underlying type + if (pTypeDef->pParent == types[TYPE_SYSTEM_ENUM]) { + pTypeDef->stackType = EVALSTACK_INT32; + } + } + + // If this is a nested type, then find the namespace of it + if (pTypeDef->pNestedIn != NULL) { + tMD_TypeDef *pRootTypeDef = pTypeDef->pNestedIn; + while (pRootTypeDef->pNestedIn != NULL) { + pRootTypeDef = pRootTypeDef->pNestedIn; + } + pTypeDef->nameSpace = pRootTypeDef->nameSpace; + } + + log_f(2, "Type: %s.%s\n", pTypeDef->nameSpace, pTypeDef->name); +} + diff --git a/dna/MetaData_Search.c b/dna/MetaData_Search.c new file mode 100644 index 0000000..4bea3f2 --- /dev/null +++ b/dna/MetaData_Search.c @@ -0,0 +1,467 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "MetaData.h" +#include "CLIFile.h" +#include "Type.h" +#include "Types.h" + +U32 MetaData_CompareNameAndSig(STRING name, BLOB_ sigBlob, tMetaData *pSigMetaData, tMD_TypeDef **ppSigClassTypeArgs, tMD_TypeDef **ppSigMethodTypeArgs, tMD_MethodDef *pMethod, tMD_TypeDef **ppMethodClassTypeArgs, tMD_TypeDef **ppMethodMethodTypeArgs) { + if (strcmp(name, pMethod->name) == 0) { + SIG sig, thisSig; + U32 e, thisE, paramCount, i; + + sig = MetaData_GetBlob(sigBlob, NULL); + thisSig = MetaData_GetBlob(pMethod->signature, NULL); + + e = MetaData_DecodeSigEntry(&sig); + thisE = MetaData_DecodeSigEntry(&thisSig); + // Check method call type (static, etc...) + if (e != thisE) { + return 0; + } + + // If method has generic arguments, check the generic type argument count + if (e & SIG_METHODDEF_GENERIC) { + e = MetaData_DecodeSigEntry(&sig); + thisE = MetaData_DecodeSigEntry(&thisSig); + // Generic argument count + if (e != thisE) { + return 0; + } + } + + e = MetaData_DecodeSigEntry(&sig); + thisE = MetaData_DecodeSigEntry(&thisSig); + // check parameter count + if (e != thisE) { + return 0; + } + paramCount = e + 1; // +1 to include the return type + + // check all parameters + for (i=0; ipMetaData, &thisSig, ppMethodClassTypeArgs, ppMethodMethodTypeArgs); + if (pParamType != pThisParamType) { + return 0; + } + } + // All parameters the same, so found the right method + return 1; + } + return 0; +} + +static tMD_MethodDef* FindMethodInType(tMD_TypeDef *pTypeDef, STRING name, tMetaData *pSigMetaData, BLOB_ sigBlob, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs) { + U32 i; + tMD_TypeDef *pLookInType = pTypeDef; + + do { + for (i=0; inumMethods; i++) { + if (MetaData_CompareNameAndSig(name, sigBlob, pSigMetaData, ppClassTypeArgs, ppMethodTypeArgs, pLookInType->ppMethods[i], pLookInType->ppClassTypeArgs, NULL)) { + return pLookInType->ppMethods[i]; + } + } + pLookInType = pLookInType->pParent; + } while (pLookInType != NULL); + + { + // Error reporting!! + U32 entry, numParams, i; + SIG sig; + char *pMsg; + tMD_TypeDef *pParamTypeDef; + + pMsg = (char*)malloc(2048); + *pMsg = 0; + sig = MetaData_GetBlob(sigBlob, &i); + entry = MetaData_DecodeSigEntry(&sig); + if ((entry & SIG_METHODDEF_HASTHIS) == 0) { + sprintf(strchr(pMsg, 0), "static "); + } + if (entry & SIG_METHODDEF_GENERIC) { + // read number of generic type args - don't care what it is + MetaData_DecodeSigEntry(&sig); + } + numParams = MetaData_DecodeSigEntry(&sig); + pParamTypeDef = Type_GetTypeFromSig(pSigMetaData, &sig, ppClassTypeArgs, ppMethodTypeArgs); // return type + if (pParamTypeDef != NULL) { + sprintf(strchr(pMsg, 0), "%s ", pParamTypeDef->name); + } + sprintf(strchr(pMsg, 0), "%s.%s.%s(", pTypeDef->nameSpace, pTypeDef->name, name); + for (i=0; i 0) { + sprintf(strchr(pMsg, 0), ","); + } + if (pParamTypeDef != NULL) { + sprintf(strchr(pMsg, 0), pParamTypeDef->name); + } else { + sprintf(strchr(pMsg, 0), "???"); + } + } + Crash("FindMethodInType(): Cannot find method %s)", pMsg); + } + FAKE_RETURN; +} + +static tMD_FieldDef* FindFieldInType(tMD_TypeDef *pTypeDef, STRING name) { + U32 i; + + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + + for (i=0; inumFields; i++) { + if (strcmp(pTypeDef->ppFields[i]->name, name) == 0) { + return pTypeDef->ppFields[i]; + } + } + + Crash("FindFieldInType(): Cannot find field '%s' in type %s.%s", name, pTypeDef->nameSpace, pTypeDef->name); + FAKE_RETURN; +} + +tMetaData* MetaData_GetResolutionScopeMetaData(tMetaData *pMetaData, IDX_TABLE resolutionScopeToken, tMD_TypeDef **ppInNestedType) { + switch (TABLE_ID(resolutionScopeToken)) { + case MD_TABLE_ASSEMBLYREF: + { + tMD_AssemblyRef *pAssemblyRef; + + pAssemblyRef = (tMD_AssemblyRef*)MetaData_GetTableRow(pMetaData, resolutionScopeToken); + *ppInNestedType = NULL; + return CLIFile_GetMetaDataForAssembly(pAssemblyRef->name); + } + case MD_TABLE_TYPEREF: + { + tMD_TypeDef *pTypeDef; + + pTypeDef = MetaData_GetTypeDefFromDefRefOrSpec(pMetaData, resolutionScopeToken, NULL, NULL); + *ppInNestedType = pTypeDef; + return pTypeDef->pMetaData; + } + default: + Crash("MetaData_GetResolutionScopeMetaData(): Cannot resolve token: 0x%08x", resolutionScopeToken); + FAKE_RETURN; + } +} + +tMD_TypeDef* MetaData_GetTypeDefFromName(tMetaData *pMetaData, STRING nameSpace, STRING name, tMD_TypeDef *pInNestedClass) { + U32 i; + + for (i=1; i<=pMetaData->tables.numRows[MD_TABLE_TYPEDEF]; i++) { + tMD_TypeDef *pTypeDef; + + pTypeDef = (tMD_TypeDef*)MetaData_GetTableRow(pMetaData, MAKE_TABLE_INDEX(MD_TABLE_TYPEDEF, i)); + if (pInNestedClass == pTypeDef->pNestedIn && + strcmp(name, pTypeDef->name) == 0 && + (pInNestedClass != NULL || strcmp(nameSpace, pTypeDef->nameSpace) == 0)) { + return pTypeDef; + } + } + + Crash("MetaData_GetTypeDefFromName(): Cannot find type %s.%s", nameSpace, name); + FAKE_RETURN; +} + +tMD_TypeDef* MetaData_GetTypeDefFromFullName(STRING assemblyName, STRING nameSpace, STRING name) { + tMetaData *pTypeMetaData; + + pTypeMetaData = CLIFile_GetMetaDataForAssembly(assemblyName); + + // Note that this cannot get a nested class, as this final parameter is always NULL + return MetaData_GetTypeDefFromName(pTypeMetaData, nameSpace, name, NULL); +} + +tMD_TypeDef* MetaData_GetTypeDefFromDefRefOrSpec(tMetaData *pMetaData, IDX_TABLE token, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs) { + void *pTableEntry; + + pTableEntry = MetaData_GetTableRow(pMetaData, token); + if (pTableEntry == NULL) { + return NULL; + } + if (((tMDC_ToTypeDef*)pTableEntry)->pTypeDef != NULL) { + return ((tMDC_ToTypeDef*)pTableEntry)->pTypeDef; + } + + switch (TABLE_ID(token)) { + case MD_TABLE_TYPEDEF: + ((tMDC_ToTypeDef*)pTableEntry)->pTypeDef = (tMD_TypeDef*)pTableEntry; + return (tMD_TypeDef*)pTableEntry; + case MD_TABLE_TYPEREF: + { + tMetaData *pTypeDefMetaData; + tMD_TypeRef *pTypeRef; + tMD_TypeDef *pTypeDef; + tMD_TypeDef *pInNestedClass; + + pTypeRef = (tMD_TypeRef*)pTableEntry; + pTypeDefMetaData = MetaData_GetResolutionScopeMetaData(pMetaData, pTypeRef->resolutionScope, &pInNestedClass); + pTypeDef = MetaData_GetTypeDefFromName(pTypeDefMetaData, pTypeRef->nameSpace, pTypeRef->name, pInNestedClass); + pTypeRef->pTypeDef = pTypeDef; + return pTypeDef; + } + case MD_TABLE_TYPESPEC: + { + tMD_TypeSpec *pTypeSpec; + tMD_TypeDef *pTypeDef; + SIG sig; + + pTypeSpec = (tMD_TypeSpec*)pTableEntry; + sig = MetaData_GetBlob(pTypeSpec->signature, NULL); + pTypeDef = Type_GetTypeFromSig(pTypeSpec->pMetaData, &sig, ppClassTypeArgs, ppMethodTypeArgs); + // Note: Cannot cache the TypeDef for this TypeSpec because it + // can change depending on class arguemnts given. + + return pTypeDef; + } + return NULL; + default: + Crash("MetaData_GetTypeDefFromDefRefOrSpec(): Cannot handle token: 0x%08x", token); + FAKE_RETURN; + } +} + +tMD_TypeDef* MetaData_GetTypeDefFromMethodDef(tMD_MethodDef *pMethodDef) { + tMetaData *pMetaData; + U32 i; + + pMetaData = pMethodDef->pMetaData; + for (i=pMetaData->tables.numRows[MD_TABLE_TYPEDEF]; i>0; i--) { + tMD_TypeDef *pTypeDef; + + pTypeDef = (tMD_TypeDef*)MetaData_GetTableRow(pMetaData, MAKE_TABLE_INDEX(MD_TABLE_TYPEDEF, i)); + if (pTypeDef->methodList <= pMethodDef->tableIndex) { + return pTypeDef; + } + } + + Crash("MetaData_GetTypeDefFromMethodDef(): Cannot find type for method: %s", pMethodDef->name); + FAKE_RETURN; +} + +tMD_TypeDef* MetaData_GetTypeDefFromFieldDef(tMD_FieldDef *pFieldDef) { + tMetaData *pMetaData; + U32 i; + + pMetaData = pFieldDef->pMetaData; + for (i=pMetaData->tables.numRows[MD_TABLE_TYPEDEF]; i>0; i--) { + tMD_TypeDef *pTypeDef; + + pTypeDef = (tMD_TypeDef*)MetaData_GetTableRow(pMetaData, MAKE_TABLE_INDEX(MD_TABLE_TYPEDEF, i)); + if (pTypeDef->fieldList <= pFieldDef->tableIndex) { + return pTypeDef; + } + } + + Crash("MetaData_GetTypeDefFromFieldDef(): Cannot find type for field: %s", pFieldDef->name); + FAKE_RETURN; +} + +tMD_MethodDef* MetaData_GetMethodDefFromDefRefOrSpec(tMetaData *pMetaData, IDX_TABLE token, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs) { + void *pTableEntry; + + pTableEntry = MetaData_GetTableRow(pMetaData, token); + if (((tMDC_ToMethodDef*)pTableEntry)->pMethodDef != NULL) { + return ((tMDC_ToMethodDef*)pTableEntry)->pMethodDef; + } + + switch (TABLE_ID(token)) { + case MD_TABLE_METHODDEF: + ((tMDC_ToMethodDef*)pTableEntry)->pMethodDef = (tMD_MethodDef*)pTableEntry; + return (tMD_MethodDef*)pTableEntry; + case MD_TABLE_MEMBERREF: + { + tMD_MemberRef *pMemberRef; + + pMemberRef = (tMD_MemberRef*)pTableEntry; + switch (TABLE_ID(pMemberRef->class_)) + { + case MD_TABLE_TYPEREF: + case MD_TABLE_TYPESPEC: + { + tMD_TypeDef *pTypeDef; + tMD_MethodDef *pMethodDef; + + pTypeDef = MetaData_GetTypeDefFromDefRefOrSpec(pMetaData, pMemberRef->class_, ppClassTypeArgs, ppMethodTypeArgs); + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + pMethodDef = FindMethodInType(pTypeDef, pMemberRef->name, pMetaData, pMemberRef->signature, pTypeDef->ppClassTypeArgs, ppMethodTypeArgs); + //pMethodDef->pMethodDef = pMethodDef; + return pMethodDef; + } + default: + Crash("MetaData_GetMethodDefFromMethodDefOrRef(): Cannot handle pMemberRef->class_=0x%08x", pMemberRef->class_); + } + } + case MD_TABLE_METHODSPEC: + { + tMD_MethodSpec *pMethodSpec; + tMD_MethodDef *pMethodDef; + + pMethodSpec = (tMD_MethodSpec*)pTableEntry; + pMethodDef = Generics_GetMethodDefFromSpec(pMethodSpec, ppClassTypeArgs, ppMethodTypeArgs); + + // Note: Cannot cache the MethodDef from the MethodSpec, as class generic arguments + // may be different. + + return pMethodDef; + } + } + + Crash("MetaData_GetMethodDefFromMethodDefOrRef(): Cannot handle token: 0x%08x", token); + FAKE_RETURN; +} + +tMD_FieldDef* MetaData_GetFieldDefFromDefOrRef(tMetaData *pMetaData, IDX_TABLE token, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs) { + void *pTableEntry; + + pTableEntry = MetaData_GetTableRow(pMetaData, token); + if (((tMDC_ToFieldDef*)pTableEntry)->pFieldDef != NULL) { + return ((tMDC_ToFieldDef*)pTableEntry)->pFieldDef; + } + + switch (TABLE_ID(token)) { + case MD_TABLE_FIELDDEF: + ((tMDC_ToFieldDef*)pTableEntry)->pFieldDef = (tMD_FieldDef*)pTableEntry; + return (tMD_FieldDef*)pTableEntry; + case MD_TABLE_MEMBERREF: + { + tMD_MemberRef *pMemberRef; + + pMemberRef = (tMD_MemberRef*)pTableEntry; + switch (TABLE_ID(pMemberRef->class_)) + { + case MD_TABLE_TYPEREF: + case MD_TABLE_TYPESPEC: + { + tMD_TypeDef *pTypeDef; + tMD_FieldDef *pFieldDef; + + pTypeDef = MetaData_GetTypeDefFromDefRefOrSpec(pMetaData, pMemberRef->class_, ppClassTypeArgs, ppMethodTypeArgs); + pFieldDef = FindFieldInType(pTypeDef, pMemberRef->name); + if (TABLE_ID(pMemberRef->class_) == MD_TABLE_TYPEREF) { + // Can't do this for TypeSpec because the resulting TypeDef will change + // depending on what the class type arguments are. + ((tMDC_ToFieldDef*)pTableEntry)->pFieldDef = pFieldDef; + } + return pFieldDef; + } + default: + Crash("MetaData_GetMethodDefFromMethodDefOrRef(): Cannot handle pMemberRef->class_=0x%08x", pMemberRef->class_); + } + } + } + + Crash("MetaData_GetFieldDefFromDefOrRef(): Cannot handle token: 0x%08x", token); + FAKE_RETURN; +} + +// Return pointer to the relevant Def structure. +// pObjectType returns: +// 0 - tMD_TypeDef +// 1 - tMD_MethodDef +// 2 - tMD_FieldDef +// (These link up with the JIT_LOADTOKEN_* opcodes) +PTR MetaData_GetTypeMethodField(tMetaData *pMetaData, IDX_TABLE token, U32 *pObjectType, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs) { + switch (TABLE_ID(token)) { + case MD_TABLE_TYPEDEF: + case MD_TABLE_TYPEREF: + case MD_TABLE_TYPESPEC: + { + tMD_TypeDef *pTypeDef; + + pTypeDef = MetaData_GetTypeDefFromDefRefOrSpec(pMetaData, token, ppClassTypeArgs, ppMethodTypeArgs); + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + *pObjectType = 0; + return (PTR)pTypeDef; + } + case MD_TABLE_METHODDEF: +method: + { + tMD_MethodDef *pMethodDef; + + pMethodDef = MetaData_GetMethodDefFromDefRefOrSpec(pMetaData, token, ppClassTypeArgs, ppMethodTypeArgs); + if (pMethodDef->isFilled == 0) { + tMD_TypeDef *pTypeDef; + + pTypeDef = MetaData_GetTypeDefFromMethodDef(pMethodDef); + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + } + *pObjectType = 1; + return (PTR)pMethodDef; + } + case MD_TABLE_FIELDDEF: +field: + { + tMD_FieldDef *pFieldDef; + + pFieldDef = MetaData_GetFieldDefFromDefOrRef(pMetaData, token, ppClassTypeArgs, ppMethodTypeArgs); + if (pFieldDef->pParentType == NULL) { + tMD_TypeDef *pTypeDef; + + pTypeDef = MetaData_GetTypeDefFromFieldDef(pFieldDef); + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + } + *pObjectType = 2; + return (PTR)pFieldDef; + } + case MD_TABLE_MEMBERREF: + { + tMD_MemberRef *pMemberRef; + SIG sig; + + pMemberRef = (tMD_MemberRef*)MetaData_GetTableRow(pMetaData, token); + sig = MetaData_GetBlob(pMemberRef->signature, NULL); + if (*(U8*)sig == 0x06) { + // Field + goto field; + } else { + // Method + goto method; + } + } + } + + Crash("MetaData_GetTypeMethodField(): Cannot handle token: 0x%08x", token); + FAKE_RETURN; +} + +tMD_ImplMap* MetaData_GetImplMap(tMetaData *pMetaData, IDX_TABLE memberForwardedToken) { + U32 i; + + for (i=pMetaData->tables.numRows[MD_TABLE_IMPLMAP]; i >= 1; i--) { + tMD_ImplMap *pImplMap = (tMD_ImplMap*)MetaData_GetTableRow(pMetaData, MAKE_TABLE_INDEX(MD_TABLE_IMPLMAP, i)); + if (pImplMap->memberForwarded == memberForwardedToken) { + return pImplMap; + } + } + + Crash("MetaData_GetImplMap() Cannot find mapping for token: 0x%08x", memberForwardedToken); + FAKE_RETURN; +} + +STRING MetaData_GetModuleRefName(tMetaData *pMetaData, IDX_TABLE memberRefToken) { + tMD_ModuleRef *pModRef = (tMD_ModuleRef*)MetaData_GetTableRow(pMetaData, memberRefToken); + return pModRef->name; +} diff --git a/dna/MethodState.c b/dna/MethodState.c new file mode 100644 index 0000000..b907022 --- /dev/null +++ b/dna/MethodState.c @@ -0,0 +1,240 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "Thread.h" +#include "MethodState.h" +#include "JIT.h" + +#ifdef GEN_COMBINED_OPCODES + +// Pointer to the least called method +static tMD_MethodDef *pLeastCalledMethod = NULL; +// Amount of memory currently used by combined JITted methods +static U32 combinedJITSize = 0; + +static void AddCall(tMD_MethodDef *pMethod) { + pMethod->genCallCount++; + // See if this method needs moving in the 'call quantity' linked-list, + // or if this method needs adding to the list for the first time + if (pMethod->genCallCount == 1) { + // Add for the first time + pMethod->pNextHighestCalls = pLeastCalledMethod; + pMethod->pPrevHighestCalls = NULL; + if (pLeastCalledMethod != NULL) { + pLeastCalledMethod->pPrevHighestCalls = pMethod; + } + pLeastCalledMethod = pMethod; + } else { + // See if this method needs moving up the linked-list + tMD_MethodDef *pCheckMethod = pMethod; + U64 numCalls = pMethod->genCallCount; + while (pCheckMethod->pNextHighestCalls != NULL && numCalls > pCheckMethod->pNextHighestCalls->genCallCount) { + pCheckMethod = pCheckMethod->pNextHighestCalls; + } + if (numCalls > pCheckMethod->genCallCount) { + // Swap the two methods in the linked-list + tMD_MethodDef *pT1, *pT2; + U32 adjacent = pCheckMethod->pPrevHighestCalls == pMethod; + + if (pCheckMethod->pNextHighestCalls != NULL) { + pCheckMethod->pNextHighestCalls->pPrevHighestCalls = pMethod; + } + pT1 = pMethod->pNextHighestCalls; + pMethod->pNextHighestCalls = pCheckMethod->pNextHighestCalls; + + if (pMethod->pPrevHighestCalls != NULL) { + pMethod->pPrevHighestCalls->pNextHighestCalls = pCheckMethod; + } else { + pLeastCalledMethod = pCheckMethod; + } + pT2 = pCheckMethod->pPrevHighestCalls; + pCheckMethod->pPrevHighestCalls = pMethod->pPrevHighestCalls; + + if (!adjacent) { + pT2->pNextHighestCalls = pMethod; + pMethod->pPrevHighestCalls = pT2; + pT1->pPrevHighestCalls = pCheckMethod; + pCheckMethod->pNextHighestCalls = pT1; + } else { + pMethod->pPrevHighestCalls = pCheckMethod; + pCheckMethod->pNextHighestCalls = pMethod; + } + } + } +} + +static void DeleteCombinedJIT(tMD_MethodDef *pMethod) { + tCombinedOpcodesMem *pCOM; + tJITted *pJIT = pMethod->pJITtedCombined; + free(pJIT->pExceptionHeaders); + free(pJIT->pOps); + pCOM = pJIT->pCombinedOpcodesMem; + while (pCOM != NULL) { + tCombinedOpcodesMem *pT = pCOM; + free(pCOM->pMem); + pCOM = pCOM->pNext; + free(pT); + } +} + +static void RemoveCombinedJIT(tMD_MethodDef *pMethod) { + if (pMethod->callStackCount == 0) { + DeleteCombinedJIT(pMethod); + } else { + // Mark this JIT for removal. Don't quite know how to do this! + log_f(0, "!!! CANNOT REMOVE COMBINED JIT !!!\n"); + } + combinedJITSize -= pMethod->pJITtedCombined->opsMemSize; + pMethod->pJITtedCombined = NULL; + log_f(1, "Removing Combined JIT: %s\n", Sys_GetMethodDesc(pMethod)); +} + +static void AddCombinedJIT(tMD_MethodDef *pMethod) { + JIT_Prepare(pMethod, 1); + combinedJITSize += pMethod->pJITtedCombined->opsMemSize; + log_f(1, "Creating Combined JIT: %s\n", Sys_GetMethodDesc(pMethod)); +} + +#endif + +tMethodState* MethodState_Direct(tThread *pThread, tMD_MethodDef *pMethod, tMethodState *pCaller, U32 isInternalNewObjCall) { + tMethodState *pThis; + + if (!pMethod->isFilled) { + tMD_TypeDef *pTypeDef; + + pTypeDef = MetaData_GetTypeDefFromMethodDef(pMethod); + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + } + + pThis = (tMethodState*)Thread_StackAlloc(pThread, sizeof(tMethodState)); + pThis->finalizerThis = NULL; + pThis->pCaller = pCaller; + pThis->pMetaData = pMethod->pMetaData; + pThis->pMethod = pMethod; + if (pMethod->pJITted == NULL) { + // If method has not already been JITted + JIT_Prepare(pMethod, 0); + } + pThis->pJIT = pMethod->pJITted; + pThis->ipOffset = 0; + pThis->pEvalStack = (PTR)Thread_StackAlloc(pThread, pThis->pMethod->pJITted->maxStack); + pThis->stackOfs = 0; + pThis->isInternalNewObjCall = isInternalNewObjCall; + pThis->pNextDelegate = NULL; + pThis->pDelegateParams = NULL; + + pThis->pParamsLocals = (PTR)Thread_StackAlloc(pThread, pMethod->parameterStackSize + pMethod->pJITted->localsStackSize); + memset(pThis->pParamsLocals, 0, pMethod->parameterStackSize + pMethod->pJITted->localsStackSize); + +#ifdef GEN_COMBINED_OPCODES + AddCall(pMethod); + + /*if (combinedJITSize < GEN_COMBINED_OPCODES_MAX_MEMORY) { + if (pMethod->genCallCount > GEN_COMBINED_OPCODES_CALL_TRIGGER) { + if (pMethod->pJITtedCombined == NULL) { + JIT_Prepare(pMethod, 1); + combinedJITSize += pMethod->pJITtedCombined->opsMemSize; + } + } + }*/ + if (pMethod->pJITtedCombined == NULL && pMethod->genCallCount >= GEN_COMBINED_OPCODES_CALL_TRIGGER && + (pMethod->pNextHighestCalls == NULL || pMethod->pPrevHighestCalls == NULL || + pMethod->pPrevHighestCalls->pJITtedCombined != NULL || + (combinedJITSize < GEN_COMBINED_OPCODES_MAX_MEMORY && pMethod->pNextHighestCalls->pJITtedCombined != NULL))) { + // Do a combined JIT, if there's enough room after removing combined JIT from previous + if (combinedJITSize > GEN_COMBINED_OPCODES_MAX_MEMORY) { + // Remove the least-called function's combined JIT + tMD_MethodDef *pToRemove = pMethod; + while (pToRemove->pPrevHighestCalls != NULL && pToRemove->pPrevHighestCalls->pJITtedCombined != NULL) { + pToRemove = pToRemove->pPrevHighestCalls; + } + if (pToRemove != pMethod) { + RemoveCombinedJIT(pToRemove); + } + } + if (combinedJITSize < GEN_COMBINED_OPCODES_MAX_MEMORY) { + // If there's enough room, then create new combined JIT + AddCombinedJIT(pMethod); + } + } + + // See if there is a combined opcode JIT ready to use + if (pMethod->pJITtedCombined != NULL) { + pThis->pJIT = pMethod->pJITtedCombined; + pMethod->callStackCount++; + } +#endif + +#ifdef DIAG_METHOD_CALLS + // Keep track of the number of times this method is called + pMethod->callCount++; + pThis->startTime = microTime(); +#endif + + return pThis; +} + +tMethodState* MethodState(tThread *pThread, tMetaData *pMetaData, IDX_TABLE methodToken, tMethodState *pCaller) { + tMD_MethodDef *pMethod; + + pMethod = MetaData_GetMethodDefFromDefRefOrSpec(pMetaData, methodToken, NULL, NULL); + return MethodState_Direct(pThread, pMethod, pCaller, 0); +} + +void MethodState_Delete(tThread *pThread, tMethodState **ppMethodState) { + tMethodState *pThis = *ppMethodState; + + +#ifdef GEN_COMBINED_OPCODES + if (pThis->pJIT != pThis->pMethod->pJITted) { + // Only decrease call-stack count if it's been using the combined JIT + pThis->pMethod->callStackCount--; + } + if (pThis->pCaller != NULL) { + // Add a call to the method being returned to. + // This is neccesary to give a more correct 'usage heuristic' to long-running + // methods that call lots of other methods. + AddCall(pThis->pCaller->pMethod); + } +#endif + +#ifdef DIAG_METHOD_CALLS + pThis->pMethod->totalTime += microTime() - pThis->startTime; +#endif + + // If this MethodState is a Finalizer, then let the heap know this Finalizer has been run + if (pThis->finalizerThis != NULL) { + Heap_UnmarkFinalizer(pThis->finalizerThis); + } + + if (pThis->pDelegateParams != NULL) { + free(pThis->pDelegateParams); + } + + // Note that the way the stack free funtion works means that only the 1st allocated chunk + // needs to be free'd, as this function just sets the current allocation offset to the address given. + Thread_StackFree(pThread, pThis); + + *ppMethodState = NULL; +} \ No newline at end of file diff --git a/dna/MethodState.h b/dna/MethodState.h new file mode 100644 index 0000000..3a0f224 --- /dev/null +++ b/dna/MethodState.h @@ -0,0 +1,71 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__METHODSTATE_H) +#define __METHODSTATE_H + +typedef struct tMethodState_ tMethodState; + +#include "MetaData.h" + +struct tMethodState_ { + // This method's meta-data + tMetaData *pMetaData; + // The method to execute + tMD_MethodDef *pMethod; + // The JITted code that this method-state is using. + // When using the combined opcode JITter, this can vary between unoptimized and optimized. + tJITted *pJIT; + // The current offset into the method's JITted code (instruction offset, not byte offset) + U32 ipOffset; + // This method's evaluation stack + PTR pEvalStack; + // The evaluation stack current offset + U32 stackOfs; + // This method's parameters & local variable storage. Params are first, followed by locals + PTR pParamsLocals; + // Is this methodstate from a NEWOBJ op-code? + U32 isInternalNewObjCall; + // If this is a Finalizer, then the 'this' object goes here, + // so it can be marked in the 'return' statement that it no longer has a Finalizer to run + HEAP_PTR finalizerThis; + // When in a delegate invoke, store the next delegate to invoke here. + // This is to allow multi-cast delegates to call all their methods. + void *pNextDelegate; + // And store the parameters to go to this delegate call + void *pDelegateParams; + // When a leave instruction has to run a 'finally' bit of code, store the leave jump address here + U32 *pOpEndFinally; + +#ifdef DIAG_METHOD_CALLS + // For tracking execution time. + U64 startTime; +#endif + + // Link to caller methodstate + tMethodState *pCaller; +}; + +//void MethodState_Init(); +tMethodState* MethodState_Direct(tThread *pThread, tMD_MethodDef *pMethod, tMethodState *pCaller, U32 isInternalNewObjCall); +tMethodState* MethodState(tThread *pThread, tMetaData *pMetaData, IDX_TABLE methodToken, tMethodState *pCaller); +void MethodState_Delete(tThread *pThread, tMethodState **ppMethodState); + +#endif \ No newline at end of file diff --git a/dna/PInvoke.c b/dna/PInvoke.c new file mode 100644 index 0000000..e2ae1fd --- /dev/null +++ b/dna/PInvoke.c @@ -0,0 +1,300 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "PInvoke.h" +#include "MetaData.h" +#include "MetaDataTables.h" +#include "JIT.h" +#include "Type.h" +#include "System.String.h" +#include "EvalStack.h" + +typedef struct tLoadedLib_ tLoadedLib; +struct tLoadedLib_ { + // The name of the library - this is the name as specified in the .NET assembly + STRING name; + // The library + void *pLib; + + tLoadedLib *pNext; +}; + +static tLoadedLib *pLoadedLibs = NULL; + +static tLoadedLib* GetLib(STRING name) { + // See if it's already loaded + tLoadedLib *pLib = pLoadedLibs; + char libName[256]; + void *pNativeLib; + + while (pLib != NULL) { + if (strcmp(name, pLib->name) == 0) { + return pLib; + } + } + sprintf(libName, "%s%s", LIB_PREFIX, name); + if (strlen(libName) >= 4) { + if (strcmp(".dll", libName + strlen(libName) - 4) == 0) { + // Cut off the ".dll" suffix if it's there + libName[strlen(libName) - 4] = 0; + } + } + // Not loaded, so load it + sprintf(strchr(libName, 0), ".%s", LIB_SUFFIX); +#if WIN32 + pNativeLib = LoadLibraryA(libName); +#else + pNativeLib = dlopen(libName, DL_LAZY); +#endif + if (pNativeLib == NULL) { + // Failed to load library + printf("Failed to load library: %s\n", libName); +#ifndef WIN32 + { + char *pError; + pError = dlerror(); + if (pError) { + printf("dlopen() Error: '%s'",pError); + } + } +#endif + return NULL; + } + pLib = TMALLOCFOREVER(tLoadedLib); + pLib->pNext = pLoadedLibs; + pLoadedLibs = pLib; + pLib->name = name; + pLib->pLib = pNativeLib; + return pLib; +} + +fnPInvoke PInvoke_GetFunction(tMetaData *pMetaData, tMD_ImplMap *pImplMap) { + tLoadedLib *pLib; + STRING libName; + void *pProc; + + libName = MetaData_GetModuleRefName(pMetaData, pImplMap->importScope); + pLib = GetLib(libName); + if (pLib == NULL) { + // Library not found, so we can't find the function + return NULL; + } + +#if WIN32 + pProc = GetProcAddress(pLib->pLib, pImplMap->importName); +#else + pProc = dlsym(pLib->pLib, pImplMap->importName); +#endif + return pProc; +} + +static void* ConvertStringToANSI(HEAP_PTR pHeapEntry) { + U32 strLen, i; + STRING2 str = SystemString_GetString(pHeapEntry, &strLen); + unsigned char *pAnsi = (unsigned char*)malloc(strLen+1); + for (i=0; ipMethod; + tMD_TypeDef *pReturnType = pMethod->pReturnType; + tMD_ImplMap *pImplMap = pCall->pImplMap; + void *pFn = pCall->fn; + U32 _argOfs = 0, _argdOfs = 0, paramOfs = 0; + U32 _tempMemOfs = 0; + U32 i; + U32 funcParams = DEFAULT; + U64 u64Ret; + float fRet; + double dRet; + + if (pReturnType != NULL) { + if (pReturnType == types[TYPE_SYSTEM_SINGLE]) { + funcParams = SINGLE; + } else if (pReturnType == types[TYPE_SYSTEM_DOUBLE]) { + funcParams = DOUBLE; + } + } + + numParams = pMethod->numberOfParameters; + for (param = 0, paramTypeNum = 0; parampParams[param]); + tMD_TypeDef *pParamType = pParam->pTypeDef; + U32 paramType = DEFAULT; + + if (pParamType->stackType == EVALSTACK_INT32) { + _args[_argOfs] = *(U32*)(pParams + paramOfs); + _argOfs++; + paramOfs += 4; + } else if (pParamType == types[TYPE_SYSTEM_STRING]) { + // Allocate a temp bit of memory for the string that's been converted. + void *pString; + if (IMPLMAP_ISCHARSET_ANSI(pImplMap) || IMPLMAP_ISCHARSET_AUTO(pImplMap) || IMPLMAP_ISCHARSET_NOTSPEC(pImplMap)) { + pString = ConvertStringToANSI(*(HEAP_PTR*)(pParams + paramOfs)); + } else if (IMPLMAP_ISCHARSET_UNICODE(pImplMap)) { + pString = ConvertStringToUnicode(*(HEAP_PTR*)(pParams + paramOfs)); + } else { + Crash("PInvoke_Call() Cannot handle string marshalling of given type"); + } + _pTempMem[_tempMemOfs] = pString; + _tempMemOfs++; + _args[_argOfs] = (U32)pString; + _argOfs++; + paramOfs += 4; + } else if (pParamType == types[TYPE_SYSTEM_INTPTR]) { + // Only works for 32-bit + _args[_argOfs] = *(U32*)(pParams + paramOfs); + _argOfs++; + paramOfs += 4; + } else if (pParamType == types[TYPE_SYSTEM_SINGLE]) { + _argsd[_argdOfs] = *(float*)(pParams + paramOfs); + _argdOfs++; + paramOfs += 4; + paramType = SINGLE; + } else if (pParamType == types[TYPE_SYSTEM_DOUBLE]) { + _argsd[_argdOfs] = *(double*)(pParams + paramOfs); + _argdOfs++; + paramOfs += 8; + paramType = DOUBLE; + } else { + Crash("PInvoke_Call() Cannot handle parameter of type: %s", pParamType->name); + } + SET_ARG_TYPE(paramTypeNum, paramType); + } + + switch (funcParams) { + +#include "PInvoke_CaseCode.h" + + case CALL5(DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT): + u64Ret = ((_uCuuuuu)(pFn))(_args[0], _args[1], _args[2], _args[3], _args[4]); + break; + + case CALL6(DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT): + u64Ret = ((_uCuuuuuu)(pFn))(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5]); + break; + + case CALL7(DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT): + u64Ret = ((_uCuuuuuuu)(pFn))(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6]); + break; + + case CALL8(DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT): + u64Ret = ((_uCuuuuuuuu)(pFn))(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7]); + break; + + case CALL9(DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT): + u64Ret = ((_uCuuuuuuuuu)(pFn))(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7], _args[8]); + break; + + case CALL10(DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT): + u64Ret = ((_uCuuuuuuuuuu)(pFn))(_args[0], _args[1], _args[2], _args[3], _args[4], _args[5], _args[6], _args[7], _args[8], _args[9]); + break; + + default: + Crash("PInvoke_Call() Cannot handle the function parameters: 0x%08x", funcParams); + } + + for (i=0; i<_tempMemOfs; i++) { + free(_pTempMem[i]); + } + + if (pReturnType == NULL) { + return 0; + } + if (pReturnType->stackType == EVALSTACK_INT32) { + *(U32*)pReturnValue = (U32)u64Ret; + return 4; + } + if (pReturnType == types[TYPE_SYSTEM_STRING]) { + if (IMPLMAP_ISCHARSET_ANSI(pImplMap) || IMPLMAP_ISCHARSET_AUTO(pImplMap) || IMPLMAP_ISCHARSET_NOTSPEC(pImplMap)) { + *(HEAP_PTR*)pReturnValue = SystemString_FromCharPtrASCII((U8*)(U32)u64Ret); + } else if (IMPLMAP_ISCHARSET_UNICODE(pImplMap)) { + *(HEAP_PTR*)pReturnValue = SystemString_FromCharPtrUTF16((U16*)(U32)u64Ret); + } else { + Crash("PInvoke_Call() Cannot handle return string in specified format"); + } + return sizeof(void*); + } + if (pReturnType == types[TYPE_SYSTEM_INTPTR]) { + *(void**)pReturnValue = (void*)(U32)u64Ret; + return sizeof(void*); + } + if (pReturnType == types[TYPE_SYSTEM_SINGLE]) { + *(double*)pReturnValue = (double)fRet; + return 8; + } + if (pReturnType == types[TYPE_SYSTEM_DOUBLE]) { + *(double*)pReturnValue = dRet; + return 8; + } + + Crash("PInvoke_Call() Cannot handle return type: %s", pReturnType->name); + FAKE_RETURN; +} diff --git a/dna/PInvoke.h b/dna/PInvoke.h new file mode 100644 index 0000000..d6e40e6 --- /dev/null +++ b/dna/PInvoke.h @@ -0,0 +1,32 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined (__PINVOKE_H) +#define __PINVOKE_H + +#include "MetaData.h" +#include "JIT.h" + +typedef void* fnPInvoke; + +fnPInvoke PInvoke_GetFunction(tMetaData *pMetaData, tMD_ImplMap *pImplMap); +U32 PInvoke_Call(tJITCallPInvoke *pCall, PTR pParams, PTR pReturnValue); + +#endif diff --git a/dna/PInvoke_CaseCode.h b/dna/PInvoke_CaseCode.h new file mode 100644 index 0000000..603fb18 --- /dev/null +++ b/dna/PInvoke_CaseCode.h @@ -0,0 +1,1109 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +case CALL0(SINGLE): + fRet = ((_fC)(pFn))(); + break; +case CALL0(DOUBLE): + dRet = ((_dC)(pFn))(); + break; +case CALL0(DEFAULT): + u64Ret = ((_uC)(pFn))(); + break; +case CALL1(SINGLE, SINGLE): + fRet = ((_fCf)(pFn))((float)_argsd[0]); + break; +case CALL1(SINGLE, DOUBLE): + fRet = ((_fCd)(pFn))(_argsd[0]); + break; +case CALL1(SINGLE, DEFAULT): + fRet = ((_fCu)(pFn))(_args[0]); + break; +case CALL1(DOUBLE, SINGLE): + dRet = ((_dCf)(pFn))((float)_argsd[0]); + break; +case CALL1(DOUBLE, DOUBLE): + dRet = ((_dCd)(pFn))(_argsd[0]); + break; +case CALL1(DOUBLE, DEFAULT): + dRet = ((_dCu)(pFn))(_args[0]); + break; +case CALL1(DEFAULT, SINGLE): + u64Ret = ((_uCf)(pFn))((float)_argsd[0]); + break; +case CALL1(DEFAULT, DOUBLE): + u64Ret = ((_uCd)(pFn))(_argsd[0]); + break; +case CALL1(DEFAULT, DEFAULT): + u64Ret = ((_uCu)(pFn))(_args[0]); + break; +case CALL2(SINGLE, SINGLE, SINGLE): + fRet = ((_fCff)(pFn))((float)_argsd[0], (float)_argsd[1]); + break; +case CALL2(SINGLE, SINGLE, DOUBLE): + fRet = ((_fCfd)(pFn))((float)_argsd[0], _argsd[1]); + break; +case CALL2(SINGLE, SINGLE, DEFAULT): + fRet = ((_fCfu)(pFn))((float)_argsd[0], _args[0]); + break; +case CALL2(SINGLE, DOUBLE, SINGLE): + fRet = ((_fCdf)(pFn))(_argsd[0], (float)_argsd[1]); + break; +case CALL2(SINGLE, DOUBLE, DOUBLE): + fRet = ((_fCdd)(pFn))(_argsd[0], _argsd[1]); + break; +case CALL2(SINGLE, DOUBLE, DEFAULT): + fRet = ((_fCdu)(pFn))(_argsd[0], _args[0]); + break; +case CALL2(SINGLE, DEFAULT, SINGLE): + fRet = ((_fCuf)(pFn))(_args[0], (float)_argsd[0]); + break; +case CALL2(SINGLE, DEFAULT, DOUBLE): + fRet = ((_fCud)(pFn))(_args[0], _argsd[0]); + break; +case CALL2(SINGLE, DEFAULT, DEFAULT): + fRet = ((_fCuu)(pFn))(_args[0], _args[1]); + break; +case CALL2(DOUBLE, SINGLE, SINGLE): + dRet = ((_dCff)(pFn))((float)_argsd[0], (float)_argsd[1]); + break; +case CALL2(DOUBLE, SINGLE, DOUBLE): + dRet = ((_dCfd)(pFn))((float)_argsd[0], _argsd[1]); + break; +case CALL2(DOUBLE, SINGLE, DEFAULT): + dRet = ((_dCfu)(pFn))((float)_argsd[0], _args[0]); + break; +case CALL2(DOUBLE, DOUBLE, SINGLE): + dRet = ((_dCdf)(pFn))(_argsd[0], (float)_argsd[1]); + break; +case CALL2(DOUBLE, DOUBLE, DOUBLE): + dRet = ((_dCdd)(pFn))(_argsd[0], _argsd[1]); + break; +case CALL2(DOUBLE, DOUBLE, DEFAULT): + dRet = ((_dCdu)(pFn))(_argsd[0], _args[0]); + break; +case CALL2(DOUBLE, DEFAULT, SINGLE): + dRet = ((_dCuf)(pFn))(_args[0], (float)_argsd[0]); + break; +case CALL2(DOUBLE, DEFAULT, DOUBLE): + dRet = ((_dCud)(pFn))(_args[0], _argsd[0]); + break; +case CALL2(DOUBLE, DEFAULT, DEFAULT): + dRet = ((_dCuu)(pFn))(_args[0], _args[1]); + break; +case CALL2(DEFAULT, SINGLE, SINGLE): + u64Ret = ((_uCff)(pFn))((float)_argsd[0], (float)_argsd[1]); + break; +case CALL2(DEFAULT, SINGLE, DOUBLE): + u64Ret = ((_uCfd)(pFn))((float)_argsd[0], _argsd[1]); + break; +case CALL2(DEFAULT, SINGLE, DEFAULT): + u64Ret = ((_uCfu)(pFn))((float)_argsd[0], _args[0]); + break; +case CALL2(DEFAULT, DOUBLE, SINGLE): + u64Ret = ((_uCdf)(pFn))(_argsd[0], (float)_argsd[1]); + break; +case CALL2(DEFAULT, DOUBLE, DOUBLE): + u64Ret = ((_uCdd)(pFn))(_argsd[0], _argsd[1]); + break; +case CALL2(DEFAULT, DOUBLE, DEFAULT): + u64Ret = ((_uCdu)(pFn))(_argsd[0], _args[0]); + break; +case CALL2(DEFAULT, DEFAULT, SINGLE): + u64Ret = ((_uCuf)(pFn))(_args[0], (float)_argsd[0]); + break; +case CALL2(DEFAULT, DEFAULT, DOUBLE): + u64Ret = ((_uCud)(pFn))(_args[0], _argsd[0]); + break; +case CALL2(DEFAULT, DEFAULT, DEFAULT): + u64Ret = ((_uCuu)(pFn))(_args[0], _args[1]); + break; +case CALL3(SINGLE, SINGLE, SINGLE, SINGLE): + fRet = ((_fCfff)(pFn))((float)_argsd[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL3(SINGLE, SINGLE, SINGLE, DOUBLE): + fRet = ((_fCffd)(pFn))((float)_argsd[0], (float)_argsd[1], _argsd[2]); + break; +case CALL3(SINGLE, SINGLE, SINGLE, DEFAULT): + fRet = ((_fCffu)(pFn))((float)_argsd[0], (float)_argsd[1], _args[0]); + break; +case CALL3(SINGLE, SINGLE, DOUBLE, SINGLE): + fRet = ((_fCfdf)(pFn))((float)_argsd[0], _argsd[1], (float)_argsd[2]); + break; +case CALL3(SINGLE, SINGLE, DOUBLE, DOUBLE): + fRet = ((_fCfdd)(pFn))((float)_argsd[0], _argsd[1], _argsd[2]); + break; +case CALL3(SINGLE, SINGLE, DOUBLE, DEFAULT): + fRet = ((_fCfdu)(pFn))((float)_argsd[0], _argsd[1], _args[0]); + break; +case CALL3(SINGLE, SINGLE, DEFAULT, SINGLE): + fRet = ((_fCfuf)(pFn))((float)_argsd[0], _args[0], (float)_argsd[1]); + break; +case CALL3(SINGLE, SINGLE, DEFAULT, DOUBLE): + fRet = ((_fCfud)(pFn))((float)_argsd[0], _args[0], _argsd[1]); + break; +case CALL3(SINGLE, SINGLE, DEFAULT, DEFAULT): + fRet = ((_fCfuu)(pFn))((float)_argsd[0], _args[0], _args[1]); + break; +case CALL3(SINGLE, DOUBLE, SINGLE, SINGLE): + fRet = ((_fCdff)(pFn))(_argsd[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL3(SINGLE, DOUBLE, SINGLE, DOUBLE): + fRet = ((_fCdfd)(pFn))(_argsd[0], (float)_argsd[1], _argsd[2]); + break; +case CALL3(SINGLE, DOUBLE, SINGLE, DEFAULT): + fRet = ((_fCdfu)(pFn))(_argsd[0], (float)_argsd[1], _args[0]); + break; +case CALL3(SINGLE, DOUBLE, DOUBLE, SINGLE): + fRet = ((_fCddf)(pFn))(_argsd[0], _argsd[1], (float)_argsd[2]); + break; +case CALL3(SINGLE, DOUBLE, DOUBLE, DOUBLE): + fRet = ((_fCddd)(pFn))(_argsd[0], _argsd[1], _argsd[2]); + break; +case CALL3(SINGLE, DOUBLE, DOUBLE, DEFAULT): + fRet = ((_fCddu)(pFn))(_argsd[0], _argsd[1], _args[0]); + break; +case CALL3(SINGLE, DOUBLE, DEFAULT, SINGLE): + fRet = ((_fCduf)(pFn))(_argsd[0], _args[0], (float)_argsd[1]); + break; +case CALL3(SINGLE, DOUBLE, DEFAULT, DOUBLE): + fRet = ((_fCdud)(pFn))(_argsd[0], _args[0], _argsd[1]); + break; +case CALL3(SINGLE, DOUBLE, DEFAULT, DEFAULT): + fRet = ((_fCduu)(pFn))(_argsd[0], _args[0], _args[1]); + break; +case CALL3(SINGLE, DEFAULT, SINGLE, SINGLE): + fRet = ((_fCuff)(pFn))(_args[0], (float)_argsd[0], (float)_argsd[1]); + break; +case CALL3(SINGLE, DEFAULT, SINGLE, DOUBLE): + fRet = ((_fCufd)(pFn))(_args[0], (float)_argsd[0], _argsd[1]); + break; +case CALL3(SINGLE, DEFAULT, SINGLE, DEFAULT): + fRet = ((_fCufu)(pFn))(_args[0], (float)_argsd[0], _args[1]); + break; +case CALL3(SINGLE, DEFAULT, DOUBLE, SINGLE): + fRet = ((_fCudf)(pFn))(_args[0], _argsd[0], (float)_argsd[1]); + break; +case CALL3(SINGLE, DEFAULT, DOUBLE, DOUBLE): + fRet = ((_fCudd)(pFn))(_args[0], _argsd[0], _argsd[1]); + break; +case CALL3(SINGLE, DEFAULT, DOUBLE, DEFAULT): + fRet = ((_fCudu)(pFn))(_args[0], _argsd[0], _args[1]); + break; +case CALL3(SINGLE, DEFAULT, DEFAULT, SINGLE): + fRet = ((_fCuuf)(pFn))(_args[0], _args[1], (float)_argsd[0]); + break; +case CALL3(SINGLE, DEFAULT, DEFAULT, DOUBLE): + fRet = ((_fCuud)(pFn))(_args[0], _args[1], _argsd[0]); + break; +case CALL3(SINGLE, DEFAULT, DEFAULT, DEFAULT): + fRet = ((_fCuuu)(pFn))(_args[0], _args[1], _args[2]); + break; +case CALL3(DOUBLE, SINGLE, SINGLE, SINGLE): + dRet = ((_dCfff)(pFn))((float)_argsd[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL3(DOUBLE, SINGLE, SINGLE, DOUBLE): + dRet = ((_dCffd)(pFn))((float)_argsd[0], (float)_argsd[1], _argsd[2]); + break; +case CALL3(DOUBLE, SINGLE, SINGLE, DEFAULT): + dRet = ((_dCffu)(pFn))((float)_argsd[0], (float)_argsd[1], _args[0]); + break; +case CALL3(DOUBLE, SINGLE, DOUBLE, SINGLE): + dRet = ((_dCfdf)(pFn))((float)_argsd[0], _argsd[1], (float)_argsd[2]); + break; +case CALL3(DOUBLE, SINGLE, DOUBLE, DOUBLE): + dRet = ((_dCfdd)(pFn))((float)_argsd[0], _argsd[1], _argsd[2]); + break; +case CALL3(DOUBLE, SINGLE, DOUBLE, DEFAULT): + dRet = ((_dCfdu)(pFn))((float)_argsd[0], _argsd[1], _args[0]); + break; +case CALL3(DOUBLE, SINGLE, DEFAULT, SINGLE): + dRet = ((_dCfuf)(pFn))((float)_argsd[0], _args[0], (float)_argsd[1]); + break; +case CALL3(DOUBLE, SINGLE, DEFAULT, DOUBLE): + dRet = ((_dCfud)(pFn))((float)_argsd[0], _args[0], _argsd[1]); + break; +case CALL3(DOUBLE, SINGLE, DEFAULT, DEFAULT): + dRet = ((_dCfuu)(pFn))((float)_argsd[0], _args[0], _args[1]); + break; +case CALL3(DOUBLE, DOUBLE, SINGLE, SINGLE): + dRet = ((_dCdff)(pFn))(_argsd[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL3(DOUBLE, DOUBLE, SINGLE, DOUBLE): + dRet = ((_dCdfd)(pFn))(_argsd[0], (float)_argsd[1], _argsd[2]); + break; +case CALL3(DOUBLE, DOUBLE, SINGLE, DEFAULT): + dRet = ((_dCdfu)(pFn))(_argsd[0], (float)_argsd[1], _args[0]); + break; +case CALL3(DOUBLE, DOUBLE, DOUBLE, SINGLE): + dRet = ((_dCddf)(pFn))(_argsd[0], _argsd[1], (float)_argsd[2]); + break; +case CALL3(DOUBLE, DOUBLE, DOUBLE, DOUBLE): + dRet = ((_dCddd)(pFn))(_argsd[0], _argsd[1], _argsd[2]); + break; +case CALL3(DOUBLE, DOUBLE, DOUBLE, DEFAULT): + dRet = ((_dCddu)(pFn))(_argsd[0], _argsd[1], _args[0]); + break; +case CALL3(DOUBLE, DOUBLE, DEFAULT, SINGLE): + dRet = ((_dCduf)(pFn))(_argsd[0], _args[0], (float)_argsd[1]); + break; +case CALL3(DOUBLE, DOUBLE, DEFAULT, DOUBLE): + dRet = ((_dCdud)(pFn))(_argsd[0], _args[0], _argsd[1]); + break; +case CALL3(DOUBLE, DOUBLE, DEFAULT, DEFAULT): + dRet = ((_dCduu)(pFn))(_argsd[0], _args[0], _args[1]); + break; +case CALL3(DOUBLE, DEFAULT, SINGLE, SINGLE): + dRet = ((_dCuff)(pFn))(_args[0], (float)_argsd[0], (float)_argsd[1]); + break; +case CALL3(DOUBLE, DEFAULT, SINGLE, DOUBLE): + dRet = ((_dCufd)(pFn))(_args[0], (float)_argsd[0], _argsd[1]); + break; +case CALL3(DOUBLE, DEFAULT, SINGLE, DEFAULT): + dRet = ((_dCufu)(pFn))(_args[0], (float)_argsd[0], _args[1]); + break; +case CALL3(DOUBLE, DEFAULT, DOUBLE, SINGLE): + dRet = ((_dCudf)(pFn))(_args[0], _argsd[0], (float)_argsd[1]); + break; +case CALL3(DOUBLE, DEFAULT, DOUBLE, DOUBLE): + dRet = ((_dCudd)(pFn))(_args[0], _argsd[0], _argsd[1]); + break; +case CALL3(DOUBLE, DEFAULT, DOUBLE, DEFAULT): + dRet = ((_dCudu)(pFn))(_args[0], _argsd[0], _args[1]); + break; +case CALL3(DOUBLE, DEFAULT, DEFAULT, SINGLE): + dRet = ((_dCuuf)(pFn))(_args[0], _args[1], (float)_argsd[0]); + break; +case CALL3(DOUBLE, DEFAULT, DEFAULT, DOUBLE): + dRet = ((_dCuud)(pFn))(_args[0], _args[1], _argsd[0]); + break; +case CALL3(DOUBLE, DEFAULT, DEFAULT, DEFAULT): + dRet = ((_dCuuu)(pFn))(_args[0], _args[1], _args[2]); + break; +case CALL3(DEFAULT, SINGLE, SINGLE, SINGLE): + u64Ret = ((_uCfff)(pFn))((float)_argsd[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL3(DEFAULT, SINGLE, SINGLE, DOUBLE): + u64Ret = ((_uCffd)(pFn))((float)_argsd[0], (float)_argsd[1], _argsd[2]); + break; +case CALL3(DEFAULT, SINGLE, SINGLE, DEFAULT): + u64Ret = ((_uCffu)(pFn))((float)_argsd[0], (float)_argsd[1], _args[0]); + break; +case CALL3(DEFAULT, SINGLE, DOUBLE, SINGLE): + u64Ret = ((_uCfdf)(pFn))((float)_argsd[0], _argsd[1], (float)_argsd[2]); + break; +case CALL3(DEFAULT, SINGLE, DOUBLE, DOUBLE): + u64Ret = ((_uCfdd)(pFn))((float)_argsd[0], _argsd[1], _argsd[2]); + break; +case CALL3(DEFAULT, SINGLE, DOUBLE, DEFAULT): + u64Ret = ((_uCfdu)(pFn))((float)_argsd[0], _argsd[1], _args[0]); + break; +case CALL3(DEFAULT, SINGLE, DEFAULT, SINGLE): + u64Ret = ((_uCfuf)(pFn))((float)_argsd[0], _args[0], (float)_argsd[1]); + break; +case CALL3(DEFAULT, SINGLE, DEFAULT, DOUBLE): + u64Ret = ((_uCfud)(pFn))((float)_argsd[0], _args[0], _argsd[1]); + break; +case CALL3(DEFAULT, SINGLE, DEFAULT, DEFAULT): + u64Ret = ((_uCfuu)(pFn))((float)_argsd[0], _args[0], _args[1]); + break; +case CALL3(DEFAULT, DOUBLE, SINGLE, SINGLE): + u64Ret = ((_uCdff)(pFn))(_argsd[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL3(DEFAULT, DOUBLE, SINGLE, DOUBLE): + u64Ret = ((_uCdfd)(pFn))(_argsd[0], (float)_argsd[1], _argsd[2]); + break; +case CALL3(DEFAULT, DOUBLE, SINGLE, DEFAULT): + u64Ret = ((_uCdfu)(pFn))(_argsd[0], (float)_argsd[1], _args[0]); + break; +case CALL3(DEFAULT, DOUBLE, DOUBLE, SINGLE): + u64Ret = ((_uCddf)(pFn))(_argsd[0], _argsd[1], (float)_argsd[2]); + break; +case CALL3(DEFAULT, DOUBLE, DOUBLE, DOUBLE): + u64Ret = ((_uCddd)(pFn))(_argsd[0], _argsd[1], _argsd[2]); + break; +case CALL3(DEFAULT, DOUBLE, DOUBLE, DEFAULT): + u64Ret = ((_uCddu)(pFn))(_argsd[0], _argsd[1], _args[0]); + break; +case CALL3(DEFAULT, DOUBLE, DEFAULT, SINGLE): + u64Ret = ((_uCduf)(pFn))(_argsd[0], _args[0], (float)_argsd[1]); + break; +case CALL3(DEFAULT, DOUBLE, DEFAULT, DOUBLE): + u64Ret = ((_uCdud)(pFn))(_argsd[0], _args[0], _argsd[1]); + break; +case CALL3(DEFAULT, DOUBLE, DEFAULT, DEFAULT): + u64Ret = ((_uCduu)(pFn))(_argsd[0], _args[0], _args[1]); + break; +case CALL3(DEFAULT, DEFAULT, SINGLE, SINGLE): + u64Ret = ((_uCuff)(pFn))(_args[0], (float)_argsd[0], (float)_argsd[1]); + break; +case CALL3(DEFAULT, DEFAULT, SINGLE, DOUBLE): + u64Ret = ((_uCufd)(pFn))(_args[0], (float)_argsd[0], _argsd[1]); + break; +case CALL3(DEFAULT, DEFAULT, SINGLE, DEFAULT): + u64Ret = ((_uCufu)(pFn))(_args[0], (float)_argsd[0], _args[1]); + break; +case CALL3(DEFAULT, DEFAULT, DOUBLE, SINGLE): + u64Ret = ((_uCudf)(pFn))(_args[0], _argsd[0], (float)_argsd[1]); + break; +case CALL3(DEFAULT, DEFAULT, DOUBLE, DOUBLE): + u64Ret = ((_uCudd)(pFn))(_args[0], _argsd[0], _argsd[1]); + break; +case CALL3(DEFAULT, DEFAULT, DOUBLE, DEFAULT): + u64Ret = ((_uCudu)(pFn))(_args[0], _argsd[0], _args[1]); + break; +case CALL3(DEFAULT, DEFAULT, DEFAULT, SINGLE): + u64Ret = ((_uCuuf)(pFn))(_args[0], _args[1], (float)_argsd[0]); + break; +case CALL3(DEFAULT, DEFAULT, DEFAULT, DOUBLE): + u64Ret = ((_uCuud)(pFn))(_args[0], _args[1], _argsd[0]); + break; +case CALL3(DEFAULT, DEFAULT, DEFAULT, DEFAULT): + u64Ret = ((_uCuuu)(pFn))(_args[0], _args[1], _args[2]); + break; +case CALL4(SINGLE, SINGLE, SINGLE, SINGLE, SINGLE): + fRet = ((_fCffff)(pFn))((float)_argsd[0], (float)_argsd[1], (float)_argsd[2], (float)_argsd[3]); + break; +case CALL4(SINGLE, SINGLE, SINGLE, SINGLE, DOUBLE): + fRet = ((_fCfffd)(pFn))((float)_argsd[0], (float)_argsd[1], (float)_argsd[2], _argsd[3]); + break; +case CALL4(SINGLE, SINGLE, SINGLE, SINGLE, DEFAULT): + fRet = ((_fCfffu)(pFn))((float)_argsd[0], (float)_argsd[1], (float)_argsd[2], _args[0]); + break; +case CALL4(SINGLE, SINGLE, SINGLE, DOUBLE, SINGLE): + fRet = ((_fCffdf)(pFn))((float)_argsd[0], (float)_argsd[1], _argsd[2], (float)_argsd[3]); + break; +case CALL4(SINGLE, SINGLE, SINGLE, DOUBLE, DOUBLE): + fRet = ((_fCffdd)(pFn))((float)_argsd[0], (float)_argsd[1], _argsd[2], _argsd[3]); + break; +case CALL4(SINGLE, SINGLE, SINGLE, DOUBLE, DEFAULT): + fRet = ((_fCffdu)(pFn))((float)_argsd[0], (float)_argsd[1], _argsd[2], _args[0]); + break; +case CALL4(SINGLE, SINGLE, SINGLE, DEFAULT, SINGLE): + fRet = ((_fCffuf)(pFn))((float)_argsd[0], (float)_argsd[1], _args[0], (float)_argsd[2]); + break; +case CALL4(SINGLE, SINGLE, SINGLE, DEFAULT, DOUBLE): + fRet = ((_fCffud)(pFn))((float)_argsd[0], (float)_argsd[1], _args[0], _argsd[2]); + break; +case CALL4(SINGLE, SINGLE, SINGLE, DEFAULT, DEFAULT): + fRet = ((_fCffuu)(pFn))((float)_argsd[0], (float)_argsd[1], _args[0], _args[1]); + break; +case CALL4(SINGLE, SINGLE, DOUBLE, SINGLE, SINGLE): + fRet = ((_fCfdff)(pFn))((float)_argsd[0], _argsd[1], (float)_argsd[2], (float)_argsd[3]); + break; +case CALL4(SINGLE, SINGLE, DOUBLE, SINGLE, DOUBLE): + fRet = ((_fCfdfd)(pFn))((float)_argsd[0], _argsd[1], (float)_argsd[2], _argsd[3]); + break; +case CALL4(SINGLE, SINGLE, DOUBLE, SINGLE, DEFAULT): + fRet = ((_fCfdfu)(pFn))((float)_argsd[0], _argsd[1], (float)_argsd[2], _args[0]); + break; +case CALL4(SINGLE, SINGLE, DOUBLE, DOUBLE, SINGLE): + fRet = ((_fCfddf)(pFn))((float)_argsd[0], _argsd[1], _argsd[2], (float)_argsd[3]); + break; +case CALL4(SINGLE, SINGLE, DOUBLE, DOUBLE, DOUBLE): + fRet = ((_fCfddd)(pFn))((float)_argsd[0], _argsd[1], _argsd[2], _argsd[3]); + break; +case CALL4(SINGLE, SINGLE, DOUBLE, DOUBLE, DEFAULT): + fRet = ((_fCfddu)(pFn))((float)_argsd[0], _argsd[1], _argsd[2], _args[0]); + break; +case CALL4(SINGLE, SINGLE, DOUBLE, DEFAULT, SINGLE): + fRet = ((_fCfduf)(pFn))((float)_argsd[0], _argsd[1], _args[0], (float)_argsd[2]); + break; +case CALL4(SINGLE, SINGLE, DOUBLE, DEFAULT, DOUBLE): + fRet = ((_fCfdud)(pFn))((float)_argsd[0], _argsd[1], _args[0], _argsd[2]); + break; +case CALL4(SINGLE, SINGLE, DOUBLE, DEFAULT, DEFAULT): + fRet = ((_fCfduu)(pFn))((float)_argsd[0], _argsd[1], _args[0], _args[1]); + break; +case CALL4(SINGLE, SINGLE, DEFAULT, SINGLE, SINGLE): + fRet = ((_fCfuff)(pFn))((float)_argsd[0], _args[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL4(SINGLE, SINGLE, DEFAULT, SINGLE, DOUBLE): + fRet = ((_fCfufd)(pFn))((float)_argsd[0], _args[0], (float)_argsd[1], _argsd[2]); + break; +case CALL4(SINGLE, SINGLE, DEFAULT, SINGLE, DEFAULT): + fRet = ((_fCfufu)(pFn))((float)_argsd[0], _args[0], (float)_argsd[1], _args[1]); + break; +case CALL4(SINGLE, SINGLE, DEFAULT, DOUBLE, SINGLE): + fRet = ((_fCfudf)(pFn))((float)_argsd[0], _args[0], _argsd[1], (float)_argsd[2]); + break; +case CALL4(SINGLE, SINGLE, DEFAULT, DOUBLE, DOUBLE): + fRet = ((_fCfudd)(pFn))((float)_argsd[0], _args[0], _argsd[1], _argsd[2]); + break; +case CALL4(SINGLE, SINGLE, DEFAULT, DOUBLE, DEFAULT): + fRet = ((_fCfudu)(pFn))((float)_argsd[0], _args[0], _argsd[1], _args[1]); + break; +case CALL4(SINGLE, SINGLE, DEFAULT, DEFAULT, SINGLE): + fRet = ((_fCfuuf)(pFn))((float)_argsd[0], _args[0], _args[1], (float)_argsd[1]); + break; +case CALL4(SINGLE, SINGLE, DEFAULT, DEFAULT, DOUBLE): + fRet = ((_fCfuud)(pFn))((float)_argsd[0], _args[0], _args[1], _argsd[1]); + break; +case CALL4(SINGLE, SINGLE, DEFAULT, DEFAULT, DEFAULT): + fRet = ((_fCfuuu)(pFn))((float)_argsd[0], _args[0], _args[1], _args[2]); + break; +case CALL4(SINGLE, DOUBLE, SINGLE, SINGLE, SINGLE): + fRet = ((_fCdfff)(pFn))(_argsd[0], (float)_argsd[1], (float)_argsd[2], (float)_argsd[3]); + break; +case CALL4(SINGLE, DOUBLE, SINGLE, SINGLE, DOUBLE): + fRet = ((_fCdffd)(pFn))(_argsd[0], (float)_argsd[1], (float)_argsd[2], _argsd[3]); + break; +case CALL4(SINGLE, DOUBLE, SINGLE, SINGLE, DEFAULT): + fRet = ((_fCdffu)(pFn))(_argsd[0], (float)_argsd[1], (float)_argsd[2], _args[0]); + break; +case CALL4(SINGLE, DOUBLE, SINGLE, DOUBLE, SINGLE): + fRet = ((_fCdfdf)(pFn))(_argsd[0], (float)_argsd[1], _argsd[2], (float)_argsd[3]); + break; +case CALL4(SINGLE, DOUBLE, SINGLE, DOUBLE, DOUBLE): + fRet = ((_fCdfdd)(pFn))(_argsd[0], (float)_argsd[1], _argsd[2], _argsd[3]); + break; +case CALL4(SINGLE, DOUBLE, SINGLE, DOUBLE, DEFAULT): + fRet = ((_fCdfdu)(pFn))(_argsd[0], (float)_argsd[1], _argsd[2], _args[0]); + break; +case CALL4(SINGLE, DOUBLE, SINGLE, DEFAULT, SINGLE): + fRet = ((_fCdfuf)(pFn))(_argsd[0], (float)_argsd[1], _args[0], (float)_argsd[2]); + break; +case CALL4(SINGLE, DOUBLE, SINGLE, DEFAULT, DOUBLE): + fRet = ((_fCdfud)(pFn))(_argsd[0], (float)_argsd[1], _args[0], _argsd[2]); + break; +case CALL4(SINGLE, DOUBLE, SINGLE, DEFAULT, DEFAULT): + fRet = ((_fCdfuu)(pFn))(_argsd[0], (float)_argsd[1], _args[0], _args[1]); + break; +case CALL4(SINGLE, DOUBLE, DOUBLE, SINGLE, SINGLE): + fRet = ((_fCddff)(pFn))(_argsd[0], _argsd[1], (float)_argsd[2], (float)_argsd[3]); + break; +case CALL4(SINGLE, DOUBLE, DOUBLE, SINGLE, DOUBLE): + fRet = ((_fCddfd)(pFn))(_argsd[0], _argsd[1], (float)_argsd[2], _argsd[3]); + break; +case CALL4(SINGLE, DOUBLE, DOUBLE, SINGLE, DEFAULT): + fRet = ((_fCddfu)(pFn))(_argsd[0], _argsd[1], (float)_argsd[2], _args[0]); + break; +case CALL4(SINGLE, DOUBLE, DOUBLE, DOUBLE, SINGLE): + fRet = ((_fCdddf)(pFn))(_argsd[0], _argsd[1], _argsd[2], (float)_argsd[3]); + break; +case CALL4(SINGLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE): + fRet = ((_fCdddd)(pFn))(_argsd[0], _argsd[1], _argsd[2], _argsd[3]); + break; +case CALL4(SINGLE, DOUBLE, DOUBLE, DOUBLE, DEFAULT): + fRet = ((_fCdddu)(pFn))(_argsd[0], _argsd[1], _argsd[2], _args[0]); + break; +case CALL4(SINGLE, DOUBLE, DOUBLE, DEFAULT, SINGLE): + fRet = ((_fCdduf)(pFn))(_argsd[0], _argsd[1], _args[0], (float)_argsd[2]); + break; +case CALL4(SINGLE, DOUBLE, DOUBLE, DEFAULT, DOUBLE): + fRet = ((_fCddud)(pFn))(_argsd[0], _argsd[1], _args[0], _argsd[2]); + break; +case CALL4(SINGLE, DOUBLE, DOUBLE, DEFAULT, DEFAULT): + fRet = ((_fCdduu)(pFn))(_argsd[0], _argsd[1], _args[0], _args[1]); + break; +case CALL4(SINGLE, DOUBLE, DEFAULT, SINGLE, SINGLE): + fRet = ((_fCduff)(pFn))(_argsd[0], _args[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL4(SINGLE, DOUBLE, DEFAULT, SINGLE, DOUBLE): + fRet = ((_fCdufd)(pFn))(_argsd[0], _args[0], (float)_argsd[1], _argsd[2]); + break; +case CALL4(SINGLE, DOUBLE, DEFAULT, SINGLE, DEFAULT): + fRet = ((_fCdufu)(pFn))(_argsd[0], _args[0], (float)_argsd[1], _args[1]); + break; +case CALL4(SINGLE, DOUBLE, DEFAULT, DOUBLE, SINGLE): + fRet = ((_fCdudf)(pFn))(_argsd[0], _args[0], _argsd[1], (float)_argsd[2]); + break; +case CALL4(SINGLE, DOUBLE, DEFAULT, DOUBLE, DOUBLE): + fRet = ((_fCdudd)(pFn))(_argsd[0], _args[0], _argsd[1], _argsd[2]); + break; +case CALL4(SINGLE, DOUBLE, DEFAULT, DOUBLE, DEFAULT): + fRet = ((_fCdudu)(pFn))(_argsd[0], _args[0], _argsd[1], _args[1]); + break; +case CALL4(SINGLE, DOUBLE, DEFAULT, DEFAULT, SINGLE): + fRet = ((_fCduuf)(pFn))(_argsd[0], _args[0], _args[1], (float)_argsd[1]); + break; +case CALL4(SINGLE, DOUBLE, DEFAULT, DEFAULT, DOUBLE): + fRet = ((_fCduud)(pFn))(_argsd[0], _args[0], _args[1], _argsd[1]); + break; +case CALL4(SINGLE, DOUBLE, DEFAULT, DEFAULT, DEFAULT): + fRet = ((_fCduuu)(pFn))(_argsd[0], _args[0], _args[1], _args[2]); + break; +case CALL4(SINGLE, DEFAULT, SINGLE, SINGLE, SINGLE): + fRet = ((_fCufff)(pFn))(_args[0], (float)_argsd[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL4(SINGLE, DEFAULT, SINGLE, SINGLE, DOUBLE): + fRet = ((_fCuffd)(pFn))(_args[0], (float)_argsd[0], (float)_argsd[1], _argsd[2]); + break; +case CALL4(SINGLE, DEFAULT, SINGLE, SINGLE, DEFAULT): + fRet = ((_fCuffu)(pFn))(_args[0], (float)_argsd[0], (float)_argsd[1], _args[1]); + break; +case CALL4(SINGLE, DEFAULT, SINGLE, DOUBLE, SINGLE): + fRet = ((_fCufdf)(pFn))(_args[0], (float)_argsd[0], _argsd[1], (float)_argsd[2]); + break; +case CALL4(SINGLE, DEFAULT, SINGLE, DOUBLE, DOUBLE): + fRet = ((_fCufdd)(pFn))(_args[0], (float)_argsd[0], _argsd[1], _argsd[2]); + break; +case CALL4(SINGLE, DEFAULT, SINGLE, DOUBLE, DEFAULT): + fRet = ((_fCufdu)(pFn))(_args[0], (float)_argsd[0], _argsd[1], _args[1]); + break; +case CALL4(SINGLE, DEFAULT, SINGLE, DEFAULT, SINGLE): + fRet = ((_fCufuf)(pFn))(_args[0], (float)_argsd[0], _args[1], (float)_argsd[1]); + break; +case CALL4(SINGLE, DEFAULT, SINGLE, DEFAULT, DOUBLE): + fRet = ((_fCufud)(pFn))(_args[0], (float)_argsd[0], _args[1], _argsd[1]); + break; +case CALL4(SINGLE, DEFAULT, SINGLE, DEFAULT, DEFAULT): + fRet = ((_fCufuu)(pFn))(_args[0], (float)_argsd[0], _args[1], _args[2]); + break; +case CALL4(SINGLE, DEFAULT, DOUBLE, SINGLE, SINGLE): + fRet = ((_fCudff)(pFn))(_args[0], _argsd[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL4(SINGLE, DEFAULT, DOUBLE, SINGLE, DOUBLE): + fRet = ((_fCudfd)(pFn))(_args[0], _argsd[0], (float)_argsd[1], _argsd[2]); + break; +case CALL4(SINGLE, DEFAULT, DOUBLE, SINGLE, DEFAULT): + fRet = ((_fCudfu)(pFn))(_args[0], _argsd[0], (float)_argsd[1], _args[1]); + break; +case CALL4(SINGLE, DEFAULT, DOUBLE, DOUBLE, SINGLE): + fRet = ((_fCuddf)(pFn))(_args[0], _argsd[0], _argsd[1], (float)_argsd[2]); + break; +case CALL4(SINGLE, DEFAULT, DOUBLE, DOUBLE, DOUBLE): + fRet = ((_fCuddd)(pFn))(_args[0], _argsd[0], _argsd[1], _argsd[2]); + break; +case CALL4(SINGLE, DEFAULT, DOUBLE, DOUBLE, DEFAULT): + fRet = ((_fCuddu)(pFn))(_args[0], _argsd[0], _argsd[1], _args[1]); + break; +case CALL4(SINGLE, DEFAULT, DOUBLE, DEFAULT, SINGLE): + fRet = ((_fCuduf)(pFn))(_args[0], _argsd[0], _args[1], (float)_argsd[1]); + break; +case CALL4(SINGLE, DEFAULT, DOUBLE, DEFAULT, DOUBLE): + fRet = ((_fCudud)(pFn))(_args[0], _argsd[0], _args[1], _argsd[1]); + break; +case CALL4(SINGLE, DEFAULT, DOUBLE, DEFAULT, DEFAULT): + fRet = ((_fCuduu)(pFn))(_args[0], _argsd[0], _args[1], _args[2]); + break; +case CALL4(SINGLE, DEFAULT, DEFAULT, SINGLE, SINGLE): + fRet = ((_fCuuff)(pFn))(_args[0], _args[1], (float)_argsd[0], (float)_argsd[1]); + break; +case CALL4(SINGLE, DEFAULT, DEFAULT, SINGLE, DOUBLE): + fRet = ((_fCuufd)(pFn))(_args[0], _args[1], (float)_argsd[0], _argsd[1]); + break; +case CALL4(SINGLE, DEFAULT, DEFAULT, SINGLE, DEFAULT): + fRet = ((_fCuufu)(pFn))(_args[0], _args[1], (float)_argsd[0], _args[2]); + break; +case CALL4(SINGLE, DEFAULT, DEFAULT, DOUBLE, SINGLE): + fRet = ((_fCuudf)(pFn))(_args[0], _args[1], _argsd[0], (float)_argsd[1]); + break; +case CALL4(SINGLE, DEFAULT, DEFAULT, DOUBLE, DOUBLE): + fRet = ((_fCuudd)(pFn))(_args[0], _args[1], _argsd[0], _argsd[1]); + break; +case CALL4(SINGLE, DEFAULT, DEFAULT, DOUBLE, DEFAULT): + fRet = ((_fCuudu)(pFn))(_args[0], _args[1], _argsd[0], _args[2]); + break; +case CALL4(SINGLE, DEFAULT, DEFAULT, DEFAULT, SINGLE): + fRet = ((_fCuuuf)(pFn))(_args[0], _args[1], _args[2], (float)_argsd[0]); + break; +case CALL4(SINGLE, DEFAULT, DEFAULT, DEFAULT, DOUBLE): + fRet = ((_fCuuud)(pFn))(_args[0], _args[1], _args[2], _argsd[0]); + break; +case CALL4(SINGLE, DEFAULT, DEFAULT, DEFAULT, DEFAULT): + fRet = ((_fCuuuu)(pFn))(_args[0], _args[1], _args[2], _args[3]); + break; +case CALL4(DOUBLE, SINGLE, SINGLE, SINGLE, SINGLE): + dRet = ((_dCffff)(pFn))((float)_argsd[0], (float)_argsd[1], (float)_argsd[2], (float)_argsd[3]); + break; +case CALL4(DOUBLE, SINGLE, SINGLE, SINGLE, DOUBLE): + dRet = ((_dCfffd)(pFn))((float)_argsd[0], (float)_argsd[1], (float)_argsd[2], _argsd[3]); + break; +case CALL4(DOUBLE, SINGLE, SINGLE, SINGLE, DEFAULT): + dRet = ((_dCfffu)(pFn))((float)_argsd[0], (float)_argsd[1], (float)_argsd[2], _args[0]); + break; +case CALL4(DOUBLE, SINGLE, SINGLE, DOUBLE, SINGLE): + dRet = ((_dCffdf)(pFn))((float)_argsd[0], (float)_argsd[1], _argsd[2], (float)_argsd[3]); + break; +case CALL4(DOUBLE, SINGLE, SINGLE, DOUBLE, DOUBLE): + dRet = ((_dCffdd)(pFn))((float)_argsd[0], (float)_argsd[1], _argsd[2], _argsd[3]); + break; +case CALL4(DOUBLE, SINGLE, SINGLE, DOUBLE, DEFAULT): + dRet = ((_dCffdu)(pFn))((float)_argsd[0], (float)_argsd[1], _argsd[2], _args[0]); + break; +case CALL4(DOUBLE, SINGLE, SINGLE, DEFAULT, SINGLE): + dRet = ((_dCffuf)(pFn))((float)_argsd[0], (float)_argsd[1], _args[0], (float)_argsd[2]); + break; +case CALL4(DOUBLE, SINGLE, SINGLE, DEFAULT, DOUBLE): + dRet = ((_dCffud)(pFn))((float)_argsd[0], (float)_argsd[1], _args[0], _argsd[2]); + break; +case CALL4(DOUBLE, SINGLE, SINGLE, DEFAULT, DEFAULT): + dRet = ((_dCffuu)(pFn))((float)_argsd[0], (float)_argsd[1], _args[0], _args[1]); + break; +case CALL4(DOUBLE, SINGLE, DOUBLE, SINGLE, SINGLE): + dRet = ((_dCfdff)(pFn))((float)_argsd[0], _argsd[1], (float)_argsd[2], (float)_argsd[3]); + break; +case CALL4(DOUBLE, SINGLE, DOUBLE, SINGLE, DOUBLE): + dRet = ((_dCfdfd)(pFn))((float)_argsd[0], _argsd[1], (float)_argsd[2], _argsd[3]); + break; +case CALL4(DOUBLE, SINGLE, DOUBLE, SINGLE, DEFAULT): + dRet = ((_dCfdfu)(pFn))((float)_argsd[0], _argsd[1], (float)_argsd[2], _args[0]); + break; +case CALL4(DOUBLE, SINGLE, DOUBLE, DOUBLE, SINGLE): + dRet = ((_dCfddf)(pFn))((float)_argsd[0], _argsd[1], _argsd[2], (float)_argsd[3]); + break; +case CALL4(DOUBLE, SINGLE, DOUBLE, DOUBLE, DOUBLE): + dRet = ((_dCfddd)(pFn))((float)_argsd[0], _argsd[1], _argsd[2], _argsd[3]); + break; +case CALL4(DOUBLE, SINGLE, DOUBLE, DOUBLE, DEFAULT): + dRet = ((_dCfddu)(pFn))((float)_argsd[0], _argsd[1], _argsd[2], _args[0]); + break; +case CALL4(DOUBLE, SINGLE, DOUBLE, DEFAULT, SINGLE): + dRet = ((_dCfduf)(pFn))((float)_argsd[0], _argsd[1], _args[0], (float)_argsd[2]); + break; +case CALL4(DOUBLE, SINGLE, DOUBLE, DEFAULT, DOUBLE): + dRet = ((_dCfdud)(pFn))((float)_argsd[0], _argsd[1], _args[0], _argsd[2]); + break; +case CALL4(DOUBLE, SINGLE, DOUBLE, DEFAULT, DEFAULT): + dRet = ((_dCfduu)(pFn))((float)_argsd[0], _argsd[1], _args[0], _args[1]); + break; +case CALL4(DOUBLE, SINGLE, DEFAULT, SINGLE, SINGLE): + dRet = ((_dCfuff)(pFn))((float)_argsd[0], _args[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL4(DOUBLE, SINGLE, DEFAULT, SINGLE, DOUBLE): + dRet = ((_dCfufd)(pFn))((float)_argsd[0], _args[0], (float)_argsd[1], _argsd[2]); + break; +case CALL4(DOUBLE, SINGLE, DEFAULT, SINGLE, DEFAULT): + dRet = ((_dCfufu)(pFn))((float)_argsd[0], _args[0], (float)_argsd[1], _args[1]); + break; +case CALL4(DOUBLE, SINGLE, DEFAULT, DOUBLE, SINGLE): + dRet = ((_dCfudf)(pFn))((float)_argsd[0], _args[0], _argsd[1], (float)_argsd[2]); + break; +case CALL4(DOUBLE, SINGLE, DEFAULT, DOUBLE, DOUBLE): + dRet = ((_dCfudd)(pFn))((float)_argsd[0], _args[0], _argsd[1], _argsd[2]); + break; +case CALL4(DOUBLE, SINGLE, DEFAULT, DOUBLE, DEFAULT): + dRet = ((_dCfudu)(pFn))((float)_argsd[0], _args[0], _argsd[1], _args[1]); + break; +case CALL4(DOUBLE, SINGLE, DEFAULT, DEFAULT, SINGLE): + dRet = ((_dCfuuf)(pFn))((float)_argsd[0], _args[0], _args[1], (float)_argsd[1]); + break; +case CALL4(DOUBLE, SINGLE, DEFAULT, DEFAULT, DOUBLE): + dRet = ((_dCfuud)(pFn))((float)_argsd[0], _args[0], _args[1], _argsd[1]); + break; +case CALL4(DOUBLE, SINGLE, DEFAULT, DEFAULT, DEFAULT): + dRet = ((_dCfuuu)(pFn))((float)_argsd[0], _args[0], _args[1], _args[2]); + break; +case CALL4(DOUBLE, DOUBLE, SINGLE, SINGLE, SINGLE): + dRet = ((_dCdfff)(pFn))(_argsd[0], (float)_argsd[1], (float)_argsd[2], (float)_argsd[3]); + break; +case CALL4(DOUBLE, DOUBLE, SINGLE, SINGLE, DOUBLE): + dRet = ((_dCdffd)(pFn))(_argsd[0], (float)_argsd[1], (float)_argsd[2], _argsd[3]); + break; +case CALL4(DOUBLE, DOUBLE, SINGLE, SINGLE, DEFAULT): + dRet = ((_dCdffu)(pFn))(_argsd[0], (float)_argsd[1], (float)_argsd[2], _args[0]); + break; +case CALL4(DOUBLE, DOUBLE, SINGLE, DOUBLE, SINGLE): + dRet = ((_dCdfdf)(pFn))(_argsd[0], (float)_argsd[1], _argsd[2], (float)_argsd[3]); + break; +case CALL4(DOUBLE, DOUBLE, SINGLE, DOUBLE, DOUBLE): + dRet = ((_dCdfdd)(pFn))(_argsd[0], (float)_argsd[1], _argsd[2], _argsd[3]); + break; +case CALL4(DOUBLE, DOUBLE, SINGLE, DOUBLE, DEFAULT): + dRet = ((_dCdfdu)(pFn))(_argsd[0], (float)_argsd[1], _argsd[2], _args[0]); + break; +case CALL4(DOUBLE, DOUBLE, SINGLE, DEFAULT, SINGLE): + dRet = ((_dCdfuf)(pFn))(_argsd[0], (float)_argsd[1], _args[0], (float)_argsd[2]); + break; +case CALL4(DOUBLE, DOUBLE, SINGLE, DEFAULT, DOUBLE): + dRet = ((_dCdfud)(pFn))(_argsd[0], (float)_argsd[1], _args[0], _argsd[2]); + break; +case CALL4(DOUBLE, DOUBLE, SINGLE, DEFAULT, DEFAULT): + dRet = ((_dCdfuu)(pFn))(_argsd[0], (float)_argsd[1], _args[0], _args[1]); + break; +case CALL4(DOUBLE, DOUBLE, DOUBLE, SINGLE, SINGLE): + dRet = ((_dCddff)(pFn))(_argsd[0], _argsd[1], (float)_argsd[2], (float)_argsd[3]); + break; +case CALL4(DOUBLE, DOUBLE, DOUBLE, SINGLE, DOUBLE): + dRet = ((_dCddfd)(pFn))(_argsd[0], _argsd[1], (float)_argsd[2], _argsd[3]); + break; +case CALL4(DOUBLE, DOUBLE, DOUBLE, SINGLE, DEFAULT): + dRet = ((_dCddfu)(pFn))(_argsd[0], _argsd[1], (float)_argsd[2], _args[0]); + break; +case CALL4(DOUBLE, DOUBLE, DOUBLE, DOUBLE, SINGLE): + dRet = ((_dCdddf)(pFn))(_argsd[0], _argsd[1], _argsd[2], (float)_argsd[3]); + break; +case CALL4(DOUBLE, DOUBLE, DOUBLE, DOUBLE, DOUBLE): + dRet = ((_dCdddd)(pFn))(_argsd[0], _argsd[1], _argsd[2], _argsd[3]); + break; +case CALL4(DOUBLE, DOUBLE, DOUBLE, DOUBLE, DEFAULT): + dRet = ((_dCdddu)(pFn))(_argsd[0], _argsd[1], _argsd[2], _args[0]); + break; +case CALL4(DOUBLE, DOUBLE, DOUBLE, DEFAULT, SINGLE): + dRet = ((_dCdduf)(pFn))(_argsd[0], _argsd[1], _args[0], (float)_argsd[2]); + break; +case CALL4(DOUBLE, DOUBLE, DOUBLE, DEFAULT, DOUBLE): + dRet = ((_dCddud)(pFn))(_argsd[0], _argsd[1], _args[0], _argsd[2]); + break; +case CALL4(DOUBLE, DOUBLE, DOUBLE, DEFAULT, DEFAULT): + dRet = ((_dCdduu)(pFn))(_argsd[0], _argsd[1], _args[0], _args[1]); + break; +case CALL4(DOUBLE, DOUBLE, DEFAULT, SINGLE, SINGLE): + dRet = ((_dCduff)(pFn))(_argsd[0], _args[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL4(DOUBLE, DOUBLE, DEFAULT, SINGLE, DOUBLE): + dRet = ((_dCdufd)(pFn))(_argsd[0], _args[0], (float)_argsd[1], _argsd[2]); + break; +case CALL4(DOUBLE, DOUBLE, DEFAULT, SINGLE, DEFAULT): + dRet = ((_dCdufu)(pFn))(_argsd[0], _args[0], (float)_argsd[1], _args[1]); + break; +case CALL4(DOUBLE, DOUBLE, DEFAULT, DOUBLE, SINGLE): + dRet = ((_dCdudf)(pFn))(_argsd[0], _args[0], _argsd[1], (float)_argsd[2]); + break; +case CALL4(DOUBLE, DOUBLE, DEFAULT, DOUBLE, DOUBLE): + dRet = ((_dCdudd)(pFn))(_argsd[0], _args[0], _argsd[1], _argsd[2]); + break; +case CALL4(DOUBLE, DOUBLE, DEFAULT, DOUBLE, DEFAULT): + dRet = ((_dCdudu)(pFn))(_argsd[0], _args[0], _argsd[1], _args[1]); + break; +case CALL4(DOUBLE, DOUBLE, DEFAULT, DEFAULT, SINGLE): + dRet = ((_dCduuf)(pFn))(_argsd[0], _args[0], _args[1], (float)_argsd[1]); + break; +case CALL4(DOUBLE, DOUBLE, DEFAULT, DEFAULT, DOUBLE): + dRet = ((_dCduud)(pFn))(_argsd[0], _args[0], _args[1], _argsd[1]); + break; +case CALL4(DOUBLE, DOUBLE, DEFAULT, DEFAULT, DEFAULT): + dRet = ((_dCduuu)(pFn))(_argsd[0], _args[0], _args[1], _args[2]); + break; +case CALL4(DOUBLE, DEFAULT, SINGLE, SINGLE, SINGLE): + dRet = ((_dCufff)(pFn))(_args[0], (float)_argsd[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL4(DOUBLE, DEFAULT, SINGLE, SINGLE, DOUBLE): + dRet = ((_dCuffd)(pFn))(_args[0], (float)_argsd[0], (float)_argsd[1], _argsd[2]); + break; +case CALL4(DOUBLE, DEFAULT, SINGLE, SINGLE, DEFAULT): + dRet = ((_dCuffu)(pFn))(_args[0], (float)_argsd[0], (float)_argsd[1], _args[1]); + break; +case CALL4(DOUBLE, DEFAULT, SINGLE, DOUBLE, SINGLE): + dRet = ((_dCufdf)(pFn))(_args[0], (float)_argsd[0], _argsd[1], (float)_argsd[2]); + break; +case CALL4(DOUBLE, DEFAULT, SINGLE, DOUBLE, DOUBLE): + dRet = ((_dCufdd)(pFn))(_args[0], (float)_argsd[0], _argsd[1], _argsd[2]); + break; +case CALL4(DOUBLE, DEFAULT, SINGLE, DOUBLE, DEFAULT): + dRet = ((_dCufdu)(pFn))(_args[0], (float)_argsd[0], _argsd[1], _args[1]); + break; +case CALL4(DOUBLE, DEFAULT, SINGLE, DEFAULT, SINGLE): + dRet = ((_dCufuf)(pFn))(_args[0], (float)_argsd[0], _args[1], (float)_argsd[1]); + break; +case CALL4(DOUBLE, DEFAULT, SINGLE, DEFAULT, DOUBLE): + dRet = ((_dCufud)(pFn))(_args[0], (float)_argsd[0], _args[1], _argsd[1]); + break; +case CALL4(DOUBLE, DEFAULT, SINGLE, DEFAULT, DEFAULT): + dRet = ((_dCufuu)(pFn))(_args[0], (float)_argsd[0], _args[1], _args[2]); + break; +case CALL4(DOUBLE, DEFAULT, DOUBLE, SINGLE, SINGLE): + dRet = ((_dCudff)(pFn))(_args[0], _argsd[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL4(DOUBLE, DEFAULT, DOUBLE, SINGLE, DOUBLE): + dRet = ((_dCudfd)(pFn))(_args[0], _argsd[0], (float)_argsd[1], _argsd[2]); + break; +case CALL4(DOUBLE, DEFAULT, DOUBLE, SINGLE, DEFAULT): + dRet = ((_dCudfu)(pFn))(_args[0], _argsd[0], (float)_argsd[1], _args[1]); + break; +case CALL4(DOUBLE, DEFAULT, DOUBLE, DOUBLE, SINGLE): + dRet = ((_dCuddf)(pFn))(_args[0], _argsd[0], _argsd[1], (float)_argsd[2]); + break; +case CALL4(DOUBLE, DEFAULT, DOUBLE, DOUBLE, DOUBLE): + dRet = ((_dCuddd)(pFn))(_args[0], _argsd[0], _argsd[1], _argsd[2]); + break; +case CALL4(DOUBLE, DEFAULT, DOUBLE, DOUBLE, DEFAULT): + dRet = ((_dCuddu)(pFn))(_args[0], _argsd[0], _argsd[1], _args[1]); + break; +case CALL4(DOUBLE, DEFAULT, DOUBLE, DEFAULT, SINGLE): + dRet = ((_dCuduf)(pFn))(_args[0], _argsd[0], _args[1], (float)_argsd[1]); + break; +case CALL4(DOUBLE, DEFAULT, DOUBLE, DEFAULT, DOUBLE): + dRet = ((_dCudud)(pFn))(_args[0], _argsd[0], _args[1], _argsd[1]); + break; +case CALL4(DOUBLE, DEFAULT, DOUBLE, DEFAULT, DEFAULT): + dRet = ((_dCuduu)(pFn))(_args[0], _argsd[0], _args[1], _args[2]); + break; +case CALL4(DOUBLE, DEFAULT, DEFAULT, SINGLE, SINGLE): + dRet = ((_dCuuff)(pFn))(_args[0], _args[1], (float)_argsd[0], (float)_argsd[1]); + break; +case CALL4(DOUBLE, DEFAULT, DEFAULT, SINGLE, DOUBLE): + dRet = ((_dCuufd)(pFn))(_args[0], _args[1], (float)_argsd[0], _argsd[1]); + break; +case CALL4(DOUBLE, DEFAULT, DEFAULT, SINGLE, DEFAULT): + dRet = ((_dCuufu)(pFn))(_args[0], _args[1], (float)_argsd[0], _args[2]); + break; +case CALL4(DOUBLE, DEFAULT, DEFAULT, DOUBLE, SINGLE): + dRet = ((_dCuudf)(pFn))(_args[0], _args[1], _argsd[0], (float)_argsd[1]); + break; +case CALL4(DOUBLE, DEFAULT, DEFAULT, DOUBLE, DOUBLE): + dRet = ((_dCuudd)(pFn))(_args[0], _args[1], _argsd[0], _argsd[1]); + break; +case CALL4(DOUBLE, DEFAULT, DEFAULT, DOUBLE, DEFAULT): + dRet = ((_dCuudu)(pFn))(_args[0], _args[1], _argsd[0], _args[2]); + break; +case CALL4(DOUBLE, DEFAULT, DEFAULT, DEFAULT, SINGLE): + dRet = ((_dCuuuf)(pFn))(_args[0], _args[1], _args[2], (float)_argsd[0]); + break; +case CALL4(DOUBLE, DEFAULT, DEFAULT, DEFAULT, DOUBLE): + dRet = ((_dCuuud)(pFn))(_args[0], _args[1], _args[2], _argsd[0]); + break; +case CALL4(DOUBLE, DEFAULT, DEFAULT, DEFAULT, DEFAULT): + dRet = ((_dCuuuu)(pFn))(_args[0], _args[1], _args[2], _args[3]); + break; +case CALL4(DEFAULT, SINGLE, SINGLE, SINGLE, SINGLE): + u64Ret = ((_uCffff)(pFn))((float)_argsd[0], (float)_argsd[1], (float)_argsd[2], (float)_argsd[3]); + break; +case CALL4(DEFAULT, SINGLE, SINGLE, SINGLE, DOUBLE): + u64Ret = ((_uCfffd)(pFn))((float)_argsd[0], (float)_argsd[1], (float)_argsd[2], _argsd[3]); + break; +case CALL4(DEFAULT, SINGLE, SINGLE, SINGLE, DEFAULT): + u64Ret = ((_uCfffu)(pFn))((float)_argsd[0], (float)_argsd[1], (float)_argsd[2], _args[0]); + break; +case CALL4(DEFAULT, SINGLE, SINGLE, DOUBLE, SINGLE): + u64Ret = ((_uCffdf)(pFn))((float)_argsd[0], (float)_argsd[1], _argsd[2], (float)_argsd[3]); + break; +case CALL4(DEFAULT, SINGLE, SINGLE, DOUBLE, DOUBLE): + u64Ret = ((_uCffdd)(pFn))((float)_argsd[0], (float)_argsd[1], _argsd[2], _argsd[3]); + break; +case CALL4(DEFAULT, SINGLE, SINGLE, DOUBLE, DEFAULT): + u64Ret = ((_uCffdu)(pFn))((float)_argsd[0], (float)_argsd[1], _argsd[2], _args[0]); + break; +case CALL4(DEFAULT, SINGLE, SINGLE, DEFAULT, SINGLE): + u64Ret = ((_uCffuf)(pFn))((float)_argsd[0], (float)_argsd[1], _args[0], (float)_argsd[2]); + break; +case CALL4(DEFAULT, SINGLE, SINGLE, DEFAULT, DOUBLE): + u64Ret = ((_uCffud)(pFn))((float)_argsd[0], (float)_argsd[1], _args[0], _argsd[2]); + break; +case CALL4(DEFAULT, SINGLE, SINGLE, DEFAULT, DEFAULT): + u64Ret = ((_uCffuu)(pFn))((float)_argsd[0], (float)_argsd[1], _args[0], _args[1]); + break; +case CALL4(DEFAULT, SINGLE, DOUBLE, SINGLE, SINGLE): + u64Ret = ((_uCfdff)(pFn))((float)_argsd[0], _argsd[1], (float)_argsd[2], (float)_argsd[3]); + break; +case CALL4(DEFAULT, SINGLE, DOUBLE, SINGLE, DOUBLE): + u64Ret = ((_uCfdfd)(pFn))((float)_argsd[0], _argsd[1], (float)_argsd[2], _argsd[3]); + break; +case CALL4(DEFAULT, SINGLE, DOUBLE, SINGLE, DEFAULT): + u64Ret = ((_uCfdfu)(pFn))((float)_argsd[0], _argsd[1], (float)_argsd[2], _args[0]); + break; +case CALL4(DEFAULT, SINGLE, DOUBLE, DOUBLE, SINGLE): + u64Ret = ((_uCfddf)(pFn))((float)_argsd[0], _argsd[1], _argsd[2], (float)_argsd[3]); + break; +case CALL4(DEFAULT, SINGLE, DOUBLE, DOUBLE, DOUBLE): + u64Ret = ((_uCfddd)(pFn))((float)_argsd[0], _argsd[1], _argsd[2], _argsd[3]); + break; +case CALL4(DEFAULT, SINGLE, DOUBLE, DOUBLE, DEFAULT): + u64Ret = ((_uCfddu)(pFn))((float)_argsd[0], _argsd[1], _argsd[2], _args[0]); + break; +case CALL4(DEFAULT, SINGLE, DOUBLE, DEFAULT, SINGLE): + u64Ret = ((_uCfduf)(pFn))((float)_argsd[0], _argsd[1], _args[0], (float)_argsd[2]); + break; +case CALL4(DEFAULT, SINGLE, DOUBLE, DEFAULT, DOUBLE): + u64Ret = ((_uCfdud)(pFn))((float)_argsd[0], _argsd[1], _args[0], _argsd[2]); + break; +case CALL4(DEFAULT, SINGLE, DOUBLE, DEFAULT, DEFAULT): + u64Ret = ((_uCfduu)(pFn))((float)_argsd[0], _argsd[1], _args[0], _args[1]); + break; +case CALL4(DEFAULT, SINGLE, DEFAULT, SINGLE, SINGLE): + u64Ret = ((_uCfuff)(pFn))((float)_argsd[0], _args[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL4(DEFAULT, SINGLE, DEFAULT, SINGLE, DOUBLE): + u64Ret = ((_uCfufd)(pFn))((float)_argsd[0], _args[0], (float)_argsd[1], _argsd[2]); + break; +case CALL4(DEFAULT, SINGLE, DEFAULT, SINGLE, DEFAULT): + u64Ret = ((_uCfufu)(pFn))((float)_argsd[0], _args[0], (float)_argsd[1], _args[1]); + break; +case CALL4(DEFAULT, SINGLE, DEFAULT, DOUBLE, SINGLE): + u64Ret = ((_uCfudf)(pFn))((float)_argsd[0], _args[0], _argsd[1], (float)_argsd[2]); + break; +case CALL4(DEFAULT, SINGLE, DEFAULT, DOUBLE, DOUBLE): + u64Ret = ((_uCfudd)(pFn))((float)_argsd[0], _args[0], _argsd[1], _argsd[2]); + break; +case CALL4(DEFAULT, SINGLE, DEFAULT, DOUBLE, DEFAULT): + u64Ret = ((_uCfudu)(pFn))((float)_argsd[0], _args[0], _argsd[1], _args[1]); + break; +case CALL4(DEFAULT, SINGLE, DEFAULT, DEFAULT, SINGLE): + u64Ret = ((_uCfuuf)(pFn))((float)_argsd[0], _args[0], _args[1], (float)_argsd[1]); + break; +case CALL4(DEFAULT, SINGLE, DEFAULT, DEFAULT, DOUBLE): + u64Ret = ((_uCfuud)(pFn))((float)_argsd[0], _args[0], _args[1], _argsd[1]); + break; +case CALL4(DEFAULT, SINGLE, DEFAULT, DEFAULT, DEFAULT): + u64Ret = ((_uCfuuu)(pFn))((float)_argsd[0], _args[0], _args[1], _args[2]); + break; +case CALL4(DEFAULT, DOUBLE, SINGLE, SINGLE, SINGLE): + u64Ret = ((_uCdfff)(pFn))(_argsd[0], (float)_argsd[1], (float)_argsd[2], (float)_argsd[3]); + break; +case CALL4(DEFAULT, DOUBLE, SINGLE, SINGLE, DOUBLE): + u64Ret = ((_uCdffd)(pFn))(_argsd[0], (float)_argsd[1], (float)_argsd[2], _argsd[3]); + break; +case CALL4(DEFAULT, DOUBLE, SINGLE, SINGLE, DEFAULT): + u64Ret = ((_uCdffu)(pFn))(_argsd[0], (float)_argsd[1], (float)_argsd[2], _args[0]); + break; +case CALL4(DEFAULT, DOUBLE, SINGLE, DOUBLE, SINGLE): + u64Ret = ((_uCdfdf)(pFn))(_argsd[0], (float)_argsd[1], _argsd[2], (float)_argsd[3]); + break; +case CALL4(DEFAULT, DOUBLE, SINGLE, DOUBLE, DOUBLE): + u64Ret = ((_uCdfdd)(pFn))(_argsd[0], (float)_argsd[1], _argsd[2], _argsd[3]); + break; +case CALL4(DEFAULT, DOUBLE, SINGLE, DOUBLE, DEFAULT): + u64Ret = ((_uCdfdu)(pFn))(_argsd[0], (float)_argsd[1], _argsd[2], _args[0]); + break; +case CALL4(DEFAULT, DOUBLE, SINGLE, DEFAULT, SINGLE): + u64Ret = ((_uCdfuf)(pFn))(_argsd[0], (float)_argsd[1], _args[0], (float)_argsd[2]); + break; +case CALL4(DEFAULT, DOUBLE, SINGLE, DEFAULT, DOUBLE): + u64Ret = ((_uCdfud)(pFn))(_argsd[0], (float)_argsd[1], _args[0], _argsd[2]); + break; +case CALL4(DEFAULT, DOUBLE, SINGLE, DEFAULT, DEFAULT): + u64Ret = ((_uCdfuu)(pFn))(_argsd[0], (float)_argsd[1], _args[0], _args[1]); + break; +case CALL4(DEFAULT, DOUBLE, DOUBLE, SINGLE, SINGLE): + u64Ret = ((_uCddff)(pFn))(_argsd[0], _argsd[1], (float)_argsd[2], (float)_argsd[3]); + break; +case CALL4(DEFAULT, DOUBLE, DOUBLE, SINGLE, DOUBLE): + u64Ret = ((_uCddfd)(pFn))(_argsd[0], _argsd[1], (float)_argsd[2], _argsd[3]); + break; +case CALL4(DEFAULT, DOUBLE, DOUBLE, SINGLE, DEFAULT): + u64Ret = ((_uCddfu)(pFn))(_argsd[0], _argsd[1], (float)_argsd[2], _args[0]); + break; +case CALL4(DEFAULT, DOUBLE, DOUBLE, DOUBLE, SINGLE): + u64Ret = ((_uCdddf)(pFn))(_argsd[0], _argsd[1], _argsd[2], (float)_argsd[3]); + break; +case CALL4(DEFAULT, DOUBLE, DOUBLE, DOUBLE, DOUBLE): + u64Ret = ((_uCdddd)(pFn))(_argsd[0], _argsd[1], _argsd[2], _argsd[3]); + break; +case CALL4(DEFAULT, DOUBLE, DOUBLE, DOUBLE, DEFAULT): + u64Ret = ((_uCdddu)(pFn))(_argsd[0], _argsd[1], _argsd[2], _args[0]); + break; +case CALL4(DEFAULT, DOUBLE, DOUBLE, DEFAULT, SINGLE): + u64Ret = ((_uCdduf)(pFn))(_argsd[0], _argsd[1], _args[0], (float)_argsd[2]); + break; +case CALL4(DEFAULT, DOUBLE, DOUBLE, DEFAULT, DOUBLE): + u64Ret = ((_uCddud)(pFn))(_argsd[0], _argsd[1], _args[0], _argsd[2]); + break; +case CALL4(DEFAULT, DOUBLE, DOUBLE, DEFAULT, DEFAULT): + u64Ret = ((_uCdduu)(pFn))(_argsd[0], _argsd[1], _args[0], _args[1]); + break; +case CALL4(DEFAULT, DOUBLE, DEFAULT, SINGLE, SINGLE): + u64Ret = ((_uCduff)(pFn))(_argsd[0], _args[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL4(DEFAULT, DOUBLE, DEFAULT, SINGLE, DOUBLE): + u64Ret = ((_uCdufd)(pFn))(_argsd[0], _args[0], (float)_argsd[1], _argsd[2]); + break; +case CALL4(DEFAULT, DOUBLE, DEFAULT, SINGLE, DEFAULT): + u64Ret = ((_uCdufu)(pFn))(_argsd[0], _args[0], (float)_argsd[1], _args[1]); + break; +case CALL4(DEFAULT, DOUBLE, DEFAULT, DOUBLE, SINGLE): + u64Ret = ((_uCdudf)(pFn))(_argsd[0], _args[0], _argsd[1], (float)_argsd[2]); + break; +case CALL4(DEFAULT, DOUBLE, DEFAULT, DOUBLE, DOUBLE): + u64Ret = ((_uCdudd)(pFn))(_argsd[0], _args[0], _argsd[1], _argsd[2]); + break; +case CALL4(DEFAULT, DOUBLE, DEFAULT, DOUBLE, DEFAULT): + u64Ret = ((_uCdudu)(pFn))(_argsd[0], _args[0], _argsd[1], _args[1]); + break; +case CALL4(DEFAULT, DOUBLE, DEFAULT, DEFAULT, SINGLE): + u64Ret = ((_uCduuf)(pFn))(_argsd[0], _args[0], _args[1], (float)_argsd[1]); + break; +case CALL4(DEFAULT, DOUBLE, DEFAULT, DEFAULT, DOUBLE): + u64Ret = ((_uCduud)(pFn))(_argsd[0], _args[0], _args[1], _argsd[1]); + break; +case CALL4(DEFAULT, DOUBLE, DEFAULT, DEFAULT, DEFAULT): + u64Ret = ((_uCduuu)(pFn))(_argsd[0], _args[0], _args[1], _args[2]); + break; +case CALL4(DEFAULT, DEFAULT, SINGLE, SINGLE, SINGLE): + u64Ret = ((_uCufff)(pFn))(_args[0], (float)_argsd[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL4(DEFAULT, DEFAULT, SINGLE, SINGLE, DOUBLE): + u64Ret = ((_uCuffd)(pFn))(_args[0], (float)_argsd[0], (float)_argsd[1], _argsd[2]); + break; +case CALL4(DEFAULT, DEFAULT, SINGLE, SINGLE, DEFAULT): + u64Ret = ((_uCuffu)(pFn))(_args[0], (float)_argsd[0], (float)_argsd[1], _args[1]); + break; +case CALL4(DEFAULT, DEFAULT, SINGLE, DOUBLE, SINGLE): + u64Ret = ((_uCufdf)(pFn))(_args[0], (float)_argsd[0], _argsd[1], (float)_argsd[2]); + break; +case CALL4(DEFAULT, DEFAULT, SINGLE, DOUBLE, DOUBLE): + u64Ret = ((_uCufdd)(pFn))(_args[0], (float)_argsd[0], _argsd[1], _argsd[2]); + break; +case CALL4(DEFAULT, DEFAULT, SINGLE, DOUBLE, DEFAULT): + u64Ret = ((_uCufdu)(pFn))(_args[0], (float)_argsd[0], _argsd[1], _args[1]); + break; +case CALL4(DEFAULT, DEFAULT, SINGLE, DEFAULT, SINGLE): + u64Ret = ((_uCufuf)(pFn))(_args[0], (float)_argsd[0], _args[1], (float)_argsd[1]); + break; +case CALL4(DEFAULT, DEFAULT, SINGLE, DEFAULT, DOUBLE): + u64Ret = ((_uCufud)(pFn))(_args[0], (float)_argsd[0], _args[1], _argsd[1]); + break; +case CALL4(DEFAULT, DEFAULT, SINGLE, DEFAULT, DEFAULT): + u64Ret = ((_uCufuu)(pFn))(_args[0], (float)_argsd[0], _args[1], _args[2]); + break; +case CALL4(DEFAULT, DEFAULT, DOUBLE, SINGLE, SINGLE): + u64Ret = ((_uCudff)(pFn))(_args[0], _argsd[0], (float)_argsd[1], (float)_argsd[2]); + break; +case CALL4(DEFAULT, DEFAULT, DOUBLE, SINGLE, DOUBLE): + u64Ret = ((_uCudfd)(pFn))(_args[0], _argsd[0], (float)_argsd[1], _argsd[2]); + break; +case CALL4(DEFAULT, DEFAULT, DOUBLE, SINGLE, DEFAULT): + u64Ret = ((_uCudfu)(pFn))(_args[0], _argsd[0], (float)_argsd[1], _args[1]); + break; +case CALL4(DEFAULT, DEFAULT, DOUBLE, DOUBLE, SINGLE): + u64Ret = ((_uCuddf)(pFn))(_args[0], _argsd[0], _argsd[1], (float)_argsd[2]); + break; +case CALL4(DEFAULT, DEFAULT, DOUBLE, DOUBLE, DOUBLE): + u64Ret = ((_uCuddd)(pFn))(_args[0], _argsd[0], _argsd[1], _argsd[2]); + break; +case CALL4(DEFAULT, DEFAULT, DOUBLE, DOUBLE, DEFAULT): + u64Ret = ((_uCuddu)(pFn))(_args[0], _argsd[0], _argsd[1], _args[1]); + break; +case CALL4(DEFAULT, DEFAULT, DOUBLE, DEFAULT, SINGLE): + u64Ret = ((_uCuduf)(pFn))(_args[0], _argsd[0], _args[1], (float)_argsd[1]); + break; +case CALL4(DEFAULT, DEFAULT, DOUBLE, DEFAULT, DOUBLE): + u64Ret = ((_uCudud)(pFn))(_args[0], _argsd[0], _args[1], _argsd[1]); + break; +case CALL4(DEFAULT, DEFAULT, DOUBLE, DEFAULT, DEFAULT): + u64Ret = ((_uCuduu)(pFn))(_args[0], _argsd[0], _args[1], _args[2]); + break; +case CALL4(DEFAULT, DEFAULT, DEFAULT, SINGLE, SINGLE): + u64Ret = ((_uCuuff)(pFn))(_args[0], _args[1], (float)_argsd[0], (float)_argsd[1]); + break; +case CALL4(DEFAULT, DEFAULT, DEFAULT, SINGLE, DOUBLE): + u64Ret = ((_uCuufd)(pFn))(_args[0], _args[1], (float)_argsd[0], _argsd[1]); + break; +case CALL4(DEFAULT, DEFAULT, DEFAULT, SINGLE, DEFAULT): + u64Ret = ((_uCuufu)(pFn))(_args[0], _args[1], (float)_argsd[0], _args[2]); + break; +case CALL4(DEFAULT, DEFAULT, DEFAULT, DOUBLE, SINGLE): + u64Ret = ((_uCuudf)(pFn))(_args[0], _args[1], _argsd[0], (float)_argsd[1]); + break; +case CALL4(DEFAULT, DEFAULT, DEFAULT, DOUBLE, DOUBLE): + u64Ret = ((_uCuudd)(pFn))(_args[0], _args[1], _argsd[0], _argsd[1]); + break; +case CALL4(DEFAULT, DEFAULT, DEFAULT, DOUBLE, DEFAULT): + u64Ret = ((_uCuudu)(pFn))(_args[0], _args[1], _argsd[0], _args[2]); + break; +case CALL4(DEFAULT, DEFAULT, DEFAULT, DEFAULT, SINGLE): + u64Ret = ((_uCuuuf)(pFn))(_args[0], _args[1], _args[2], (float)_argsd[0]); + break; +case CALL4(DEFAULT, DEFAULT, DEFAULT, DEFAULT, DOUBLE): + u64Ret = ((_uCuuud)(pFn))(_args[0], _args[1], _args[2], _argsd[0]); + break; +case CALL4(DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT): + u64Ret = ((_uCuuuu)(pFn))(_args[0], _args[1], _args[2], _args[3]); + break; diff --git a/dna/PInvoke_TypeDef.h b/dna/PInvoke_TypeDef.h new file mode 100644 index 0000000..8ff2e69 --- /dev/null +++ b/dna/PInvoke_TypeDef.h @@ -0,0 +1,383 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +typedef float (STDCALL *_fC)(); +typedef double (STDCALL *_dC)(); +typedef U64 (STDCALL *_uC)(); +typedef float (STDCALL *_fCf)(float _0); +typedef float (STDCALL *_fCd)(double _0); +typedef float (STDCALL *_fCu)(U32 _0); +typedef double (STDCALL *_dCf)(float _0); +typedef double (STDCALL *_dCd)(double _0); +typedef double (STDCALL *_dCu)(U32 _0); +typedef U64 (STDCALL *_uCf)(float _0); +typedef U64 (STDCALL *_uCd)(double _0); +typedef U64 (STDCALL *_uCu)(U32 _0); +typedef float (STDCALL *_fCff)(float _0, float _1); +typedef float (STDCALL *_fCfd)(float _0, double _1); +typedef float (STDCALL *_fCfu)(float _0, U32 _1); +typedef float (STDCALL *_fCdf)(double _0, float _1); +typedef float (STDCALL *_fCdd)(double _0, double _1); +typedef float (STDCALL *_fCdu)(double _0, U32 _1); +typedef float (STDCALL *_fCuf)(U32 _0, float _1); +typedef float (STDCALL *_fCud)(U32 _0, double _1); +typedef float (STDCALL *_fCuu)(U32 _0, U32 _1); +typedef double (STDCALL *_dCff)(float _0, float _1); +typedef double (STDCALL *_dCfd)(float _0, double _1); +typedef double (STDCALL *_dCfu)(float _0, U32 _1); +typedef double (STDCALL *_dCdf)(double _0, float _1); +typedef double (STDCALL *_dCdd)(double _0, double _1); +typedef double (STDCALL *_dCdu)(double _0, U32 _1); +typedef double (STDCALL *_dCuf)(U32 _0, float _1); +typedef double (STDCALL *_dCud)(U32 _0, double _1); +typedef double (STDCALL *_dCuu)(U32 _0, U32 _1); +typedef U64 (STDCALL *_uCff)(float _0, float _1); +typedef U64 (STDCALL *_uCfd)(float _0, double _1); +typedef U64 (STDCALL *_uCfu)(float _0, U32 _1); +typedef U64 (STDCALL *_uCdf)(double _0, float _1); +typedef U64 (STDCALL *_uCdd)(double _0, double _1); +typedef U64 (STDCALL *_uCdu)(double _0, U32 _1); +typedef U64 (STDCALL *_uCuf)(U32 _0, float _1); +typedef U64 (STDCALL *_uCud)(U32 _0, double _1); +typedef U64 (STDCALL *_uCuu)(U32 _0, U32 _1); +typedef float (STDCALL *_fCfff)(float _0, float _1, float _2); +typedef float (STDCALL *_fCffd)(float _0, float _1, double _2); +typedef float (STDCALL *_fCffu)(float _0, float _1, U32 _2); +typedef float (STDCALL *_fCfdf)(float _0, double _1, float _2); +typedef float (STDCALL *_fCfdd)(float _0, double _1, double _2); +typedef float (STDCALL *_fCfdu)(float _0, double _1, U32 _2); +typedef float (STDCALL *_fCfuf)(float _0, U32 _1, float _2); +typedef float (STDCALL *_fCfud)(float _0, U32 _1, double _2); +typedef float (STDCALL *_fCfuu)(float _0, U32 _1, U32 _2); +typedef float (STDCALL *_fCdff)(double _0, float _1, float _2); +typedef float (STDCALL *_fCdfd)(double _0, float _1, double _2); +typedef float (STDCALL *_fCdfu)(double _0, float _1, U32 _2); +typedef float (STDCALL *_fCddf)(double _0, double _1, float _2); +typedef float (STDCALL *_fCddd)(double _0, double _1, double _2); +typedef float (STDCALL *_fCddu)(double _0, double _1, U32 _2); +typedef float (STDCALL *_fCduf)(double _0, U32 _1, float _2); +typedef float (STDCALL *_fCdud)(double _0, U32 _1, double _2); +typedef float (STDCALL *_fCduu)(double _0, U32 _1, U32 _2); +typedef float (STDCALL *_fCuff)(U32 _0, float _1, float _2); +typedef float (STDCALL *_fCufd)(U32 _0, float _1, double _2); +typedef float (STDCALL *_fCufu)(U32 _0, float _1, U32 _2); +typedef float (STDCALL *_fCudf)(U32 _0, double _1, float _2); +typedef float (STDCALL *_fCudd)(U32 _0, double _1, double _2); +typedef float (STDCALL *_fCudu)(U32 _0, double _1, U32 _2); +typedef float (STDCALL *_fCuuf)(U32 _0, U32 _1, float _2); +typedef float (STDCALL *_fCuud)(U32 _0, U32 _1, double _2); +typedef float (STDCALL *_fCuuu)(U32 _0, U32 _1, U32 _2); +typedef double (STDCALL *_dCfff)(float _0, float _1, float _2); +typedef double (STDCALL *_dCffd)(float _0, float _1, double _2); +typedef double (STDCALL *_dCffu)(float _0, float _1, U32 _2); +typedef double (STDCALL *_dCfdf)(float _0, double _1, float _2); +typedef double (STDCALL *_dCfdd)(float _0, double _1, double _2); +typedef double (STDCALL *_dCfdu)(float _0, double _1, U32 _2); +typedef double (STDCALL *_dCfuf)(float _0, U32 _1, float _2); +typedef double (STDCALL *_dCfud)(float _0, U32 _1, double _2); +typedef double (STDCALL *_dCfuu)(float _0, U32 _1, U32 _2); +typedef double (STDCALL *_dCdff)(double _0, float _1, float _2); +typedef double (STDCALL *_dCdfd)(double _0, float _1, double _2); +typedef double (STDCALL *_dCdfu)(double _0, float _1, U32 _2); +typedef double (STDCALL *_dCddf)(double _0, double _1, float _2); +typedef double (STDCALL *_dCddd)(double _0, double _1, double _2); +typedef double (STDCALL *_dCddu)(double _0, double _1, U32 _2); +typedef double (STDCALL *_dCduf)(double _0, U32 _1, float _2); +typedef double (STDCALL *_dCdud)(double _0, U32 _1, double _2); +typedef double (STDCALL *_dCduu)(double _0, U32 _1, U32 _2); +typedef double (STDCALL *_dCuff)(U32 _0, float _1, float _2); +typedef double (STDCALL *_dCufd)(U32 _0, float _1, double _2); +typedef double (STDCALL *_dCufu)(U32 _0, float _1, U32 _2); +typedef double (STDCALL *_dCudf)(U32 _0, double _1, float _2); +typedef double (STDCALL *_dCudd)(U32 _0, double _1, double _2); +typedef double (STDCALL *_dCudu)(U32 _0, double _1, U32 _2); +typedef double (STDCALL *_dCuuf)(U32 _0, U32 _1, float _2); +typedef double (STDCALL *_dCuud)(U32 _0, U32 _1, double _2); +typedef double (STDCALL *_dCuuu)(U32 _0, U32 _1, U32 _2); +typedef U64 (STDCALL *_uCfff)(float _0, float _1, float _2); +typedef U64 (STDCALL *_uCffd)(float _0, float _1, double _2); +typedef U64 (STDCALL *_uCffu)(float _0, float _1, U32 _2); +typedef U64 (STDCALL *_uCfdf)(float _0, double _1, float _2); +typedef U64 (STDCALL *_uCfdd)(float _0, double _1, double _2); +typedef U64 (STDCALL *_uCfdu)(float _0, double _1, U32 _2); +typedef U64 (STDCALL *_uCfuf)(float _0, U32 _1, float _2); +typedef U64 (STDCALL *_uCfud)(float _0, U32 _1, double _2); +typedef U64 (STDCALL *_uCfuu)(float _0, U32 _1, U32 _2); +typedef U64 (STDCALL *_uCdff)(double _0, float _1, float _2); +typedef U64 (STDCALL *_uCdfd)(double _0, float _1, double _2); +typedef U64 (STDCALL *_uCdfu)(double _0, float _1, U32 _2); +typedef U64 (STDCALL *_uCddf)(double _0, double _1, float _2); +typedef U64 (STDCALL *_uCddd)(double _0, double _1, double _2); +typedef U64 (STDCALL *_uCddu)(double _0, double _1, U32 _2); +typedef U64 (STDCALL *_uCduf)(double _0, U32 _1, float _2); +typedef U64 (STDCALL *_uCdud)(double _0, U32 _1, double _2); +typedef U64 (STDCALL *_uCduu)(double _0, U32 _1, U32 _2); +typedef U64 (STDCALL *_uCuff)(U32 _0, float _1, float _2); +typedef U64 (STDCALL *_uCufd)(U32 _0, float _1, double _2); +typedef U64 (STDCALL *_uCufu)(U32 _0, float _1, U32 _2); +typedef U64 (STDCALL *_uCudf)(U32 _0, double _1, float _2); +typedef U64 (STDCALL *_uCudd)(U32 _0, double _1, double _2); +typedef U64 (STDCALL *_uCudu)(U32 _0, double _1, U32 _2); +typedef U64 (STDCALL *_uCuuf)(U32 _0, U32 _1, float _2); +typedef U64 (STDCALL *_uCuud)(U32 _0, U32 _1, double _2); +typedef U64 (STDCALL *_uCuuu)(U32 _0, U32 _1, U32 _2); +typedef float (STDCALL *_fCffff)(float _0, float _1, float _2, float _3); +typedef float (STDCALL *_fCfffd)(float _0, float _1, float _2, double _3); +typedef float (STDCALL *_fCfffu)(float _0, float _1, float _2, U32 _3); +typedef float (STDCALL *_fCffdf)(float _0, float _1, double _2, float _3); +typedef float (STDCALL *_fCffdd)(float _0, float _1, double _2, double _3); +typedef float (STDCALL *_fCffdu)(float _0, float _1, double _2, U32 _3); +typedef float (STDCALL *_fCffuf)(float _0, float _1, U32 _2, float _3); +typedef float (STDCALL *_fCffud)(float _0, float _1, U32 _2, double _3); +typedef float (STDCALL *_fCffuu)(float _0, float _1, U32 _2, U32 _3); +typedef float (STDCALL *_fCfdff)(float _0, double _1, float _2, float _3); +typedef float (STDCALL *_fCfdfd)(float _0, double _1, float _2, double _3); +typedef float (STDCALL *_fCfdfu)(float _0, double _1, float _2, U32 _3); +typedef float (STDCALL *_fCfddf)(float _0, double _1, double _2, float _3); +typedef float (STDCALL *_fCfddd)(float _0, double _1, double _2, double _3); +typedef float (STDCALL *_fCfddu)(float _0, double _1, double _2, U32 _3); +typedef float (STDCALL *_fCfduf)(float _0, double _1, U32 _2, float _3); +typedef float (STDCALL *_fCfdud)(float _0, double _1, U32 _2, double _3); +typedef float (STDCALL *_fCfduu)(float _0, double _1, U32 _2, U32 _3); +typedef float (STDCALL *_fCfuff)(float _0, U32 _1, float _2, float _3); +typedef float (STDCALL *_fCfufd)(float _0, U32 _1, float _2, double _3); +typedef float (STDCALL *_fCfufu)(float _0, U32 _1, float _2, U32 _3); +typedef float (STDCALL *_fCfudf)(float _0, U32 _1, double _2, float _3); +typedef float (STDCALL *_fCfudd)(float _0, U32 _1, double _2, double _3); +typedef float (STDCALL *_fCfudu)(float _0, U32 _1, double _2, U32 _3); +typedef float (STDCALL *_fCfuuf)(float _0, U32 _1, U32 _2, float _3); +typedef float (STDCALL *_fCfuud)(float _0, U32 _1, U32 _2, double _3); +typedef float (STDCALL *_fCfuuu)(float _0, U32 _1, U32 _2, U32 _3); +typedef float (STDCALL *_fCdfff)(double _0, float _1, float _2, float _3); +typedef float (STDCALL *_fCdffd)(double _0, float _1, float _2, double _3); +typedef float (STDCALL *_fCdffu)(double _0, float _1, float _2, U32 _3); +typedef float (STDCALL *_fCdfdf)(double _0, float _1, double _2, float _3); +typedef float (STDCALL *_fCdfdd)(double _0, float _1, double _2, double _3); +typedef float (STDCALL *_fCdfdu)(double _0, float _1, double _2, U32 _3); +typedef float (STDCALL *_fCdfuf)(double _0, float _1, U32 _2, float _3); +typedef float (STDCALL *_fCdfud)(double _0, float _1, U32 _2, double _3); +typedef float (STDCALL *_fCdfuu)(double _0, float _1, U32 _2, U32 _3); +typedef float (STDCALL *_fCddff)(double _0, double _1, float _2, float _3); +typedef float (STDCALL *_fCddfd)(double _0, double _1, float _2, double _3); +typedef float (STDCALL *_fCddfu)(double _0, double _1, float _2, U32 _3); +typedef float (STDCALL *_fCdddf)(double _0, double _1, double _2, float _3); +typedef float (STDCALL *_fCdddd)(double _0, double _1, double _2, double _3); +typedef float (STDCALL *_fCdddu)(double _0, double _1, double _2, U32 _3); +typedef float (STDCALL *_fCdduf)(double _0, double _1, U32 _2, float _3); +typedef float (STDCALL *_fCddud)(double _0, double _1, U32 _2, double _3); +typedef float (STDCALL *_fCdduu)(double _0, double _1, U32 _2, U32 _3); +typedef float (STDCALL *_fCduff)(double _0, U32 _1, float _2, float _3); +typedef float (STDCALL *_fCdufd)(double _0, U32 _1, float _2, double _3); +typedef float (STDCALL *_fCdufu)(double _0, U32 _1, float _2, U32 _3); +typedef float (STDCALL *_fCdudf)(double _0, U32 _1, double _2, float _3); +typedef float (STDCALL *_fCdudd)(double _0, U32 _1, double _2, double _3); +typedef float (STDCALL *_fCdudu)(double _0, U32 _1, double _2, U32 _3); +typedef float (STDCALL *_fCduuf)(double _0, U32 _1, U32 _2, float _3); +typedef float (STDCALL *_fCduud)(double _0, U32 _1, U32 _2, double _3); +typedef float (STDCALL *_fCduuu)(double _0, U32 _1, U32 _2, U32 _3); +typedef float (STDCALL *_fCufff)(U32 _0, float _1, float _2, float _3); +typedef float (STDCALL *_fCuffd)(U32 _0, float _1, float _2, double _3); +typedef float (STDCALL *_fCuffu)(U32 _0, float _1, float _2, U32 _3); +typedef float (STDCALL *_fCufdf)(U32 _0, float _1, double _2, float _3); +typedef float (STDCALL *_fCufdd)(U32 _0, float _1, double _2, double _3); +typedef float (STDCALL *_fCufdu)(U32 _0, float _1, double _2, U32 _3); +typedef float (STDCALL *_fCufuf)(U32 _0, float _1, U32 _2, float _3); +typedef float (STDCALL *_fCufud)(U32 _0, float _1, U32 _2, double _3); +typedef float (STDCALL *_fCufuu)(U32 _0, float _1, U32 _2, U32 _3); +typedef float (STDCALL *_fCudff)(U32 _0, double _1, float _2, float _3); +typedef float (STDCALL *_fCudfd)(U32 _0, double _1, float _2, double _3); +typedef float (STDCALL *_fCudfu)(U32 _0, double _1, float _2, U32 _3); +typedef float (STDCALL *_fCuddf)(U32 _0, double _1, double _2, float _3); +typedef float (STDCALL *_fCuddd)(U32 _0, double _1, double _2, double _3); +typedef float (STDCALL *_fCuddu)(U32 _0, double _1, double _2, U32 _3); +typedef float (STDCALL *_fCuduf)(U32 _0, double _1, U32 _2, float _3); +typedef float (STDCALL *_fCudud)(U32 _0, double _1, U32 _2, double _3); +typedef float (STDCALL *_fCuduu)(U32 _0, double _1, U32 _2, U32 _3); +typedef float (STDCALL *_fCuuff)(U32 _0, U32 _1, float _2, float _3); +typedef float (STDCALL *_fCuufd)(U32 _0, U32 _1, float _2, double _3); +typedef float (STDCALL *_fCuufu)(U32 _0, U32 _1, float _2, U32 _3); +typedef float (STDCALL *_fCuudf)(U32 _0, U32 _1, double _2, float _3); +typedef float (STDCALL *_fCuudd)(U32 _0, U32 _1, double _2, double _3); +typedef float (STDCALL *_fCuudu)(U32 _0, U32 _1, double _2, U32 _3); +typedef float (STDCALL *_fCuuuf)(U32 _0, U32 _1, U32 _2, float _3); +typedef float (STDCALL *_fCuuud)(U32 _0, U32 _1, U32 _2, double _3); +typedef float (STDCALL *_fCuuuu)(U32 _0, U32 _1, U32 _2, U32 _3); +typedef double (STDCALL *_dCffff)(float _0, float _1, float _2, float _3); +typedef double (STDCALL *_dCfffd)(float _0, float _1, float _2, double _3); +typedef double (STDCALL *_dCfffu)(float _0, float _1, float _2, U32 _3); +typedef double (STDCALL *_dCffdf)(float _0, float _1, double _2, float _3); +typedef double (STDCALL *_dCffdd)(float _0, float _1, double _2, double _3); +typedef double (STDCALL *_dCffdu)(float _0, float _1, double _2, U32 _3); +typedef double (STDCALL *_dCffuf)(float _0, float _1, U32 _2, float _3); +typedef double (STDCALL *_dCffud)(float _0, float _1, U32 _2, double _3); +typedef double (STDCALL *_dCffuu)(float _0, float _1, U32 _2, U32 _3); +typedef double (STDCALL *_dCfdff)(float _0, double _1, float _2, float _3); +typedef double (STDCALL *_dCfdfd)(float _0, double _1, float _2, double _3); +typedef double (STDCALL *_dCfdfu)(float _0, double _1, float _2, U32 _3); +typedef double (STDCALL *_dCfddf)(float _0, double _1, double _2, float _3); +typedef double (STDCALL *_dCfddd)(float _0, double _1, double _2, double _3); +typedef double (STDCALL *_dCfddu)(float _0, double _1, double _2, U32 _3); +typedef double (STDCALL *_dCfduf)(float _0, double _1, U32 _2, float _3); +typedef double (STDCALL *_dCfdud)(float _0, double _1, U32 _2, double _3); +typedef double (STDCALL *_dCfduu)(float _0, double _1, U32 _2, U32 _3); +typedef double (STDCALL *_dCfuff)(float _0, U32 _1, float _2, float _3); +typedef double (STDCALL *_dCfufd)(float _0, U32 _1, float _2, double _3); +typedef double (STDCALL *_dCfufu)(float _0, U32 _1, float _2, U32 _3); +typedef double (STDCALL *_dCfudf)(float _0, U32 _1, double _2, float _3); +typedef double (STDCALL *_dCfudd)(float _0, U32 _1, double _2, double _3); +typedef double (STDCALL *_dCfudu)(float _0, U32 _1, double _2, U32 _3); +typedef double (STDCALL *_dCfuuf)(float _0, U32 _1, U32 _2, float _3); +typedef double (STDCALL *_dCfuud)(float _0, U32 _1, U32 _2, double _3); +typedef double (STDCALL *_dCfuuu)(float _0, U32 _1, U32 _2, U32 _3); +typedef double (STDCALL *_dCdfff)(double _0, float _1, float _2, float _3); +typedef double (STDCALL *_dCdffd)(double _0, float _1, float _2, double _3); +typedef double (STDCALL *_dCdffu)(double _0, float _1, float _2, U32 _3); +typedef double (STDCALL *_dCdfdf)(double _0, float _1, double _2, float _3); +typedef double (STDCALL *_dCdfdd)(double _0, float _1, double _2, double _3); +typedef double (STDCALL *_dCdfdu)(double _0, float _1, double _2, U32 _3); +typedef double (STDCALL *_dCdfuf)(double _0, float _1, U32 _2, float _3); +typedef double (STDCALL *_dCdfud)(double _0, float _1, U32 _2, double _3); +typedef double (STDCALL *_dCdfuu)(double _0, float _1, U32 _2, U32 _3); +typedef double (STDCALL *_dCddff)(double _0, double _1, float _2, float _3); +typedef double (STDCALL *_dCddfd)(double _0, double _1, float _2, double _3); +typedef double (STDCALL *_dCddfu)(double _0, double _1, float _2, U32 _3); +typedef double (STDCALL *_dCdddf)(double _0, double _1, double _2, float _3); +typedef double (STDCALL *_dCdddd)(double _0, double _1, double _2, double _3); +typedef double (STDCALL *_dCdddu)(double _0, double _1, double _2, U32 _3); +typedef double (STDCALL *_dCdduf)(double _0, double _1, U32 _2, float _3); +typedef double (STDCALL *_dCddud)(double _0, double _1, U32 _2, double _3); +typedef double (STDCALL *_dCdduu)(double _0, double _1, U32 _2, U32 _3); +typedef double (STDCALL *_dCduff)(double _0, U32 _1, float _2, float _3); +typedef double (STDCALL *_dCdufd)(double _0, U32 _1, float _2, double _3); +typedef double (STDCALL *_dCdufu)(double _0, U32 _1, float _2, U32 _3); +typedef double (STDCALL *_dCdudf)(double _0, U32 _1, double _2, float _3); +typedef double (STDCALL *_dCdudd)(double _0, U32 _1, double _2, double _3); +typedef double (STDCALL *_dCdudu)(double _0, U32 _1, double _2, U32 _3); +typedef double (STDCALL *_dCduuf)(double _0, U32 _1, U32 _2, float _3); +typedef double (STDCALL *_dCduud)(double _0, U32 _1, U32 _2, double _3); +typedef double (STDCALL *_dCduuu)(double _0, U32 _1, U32 _2, U32 _3); +typedef double (STDCALL *_dCufff)(U32 _0, float _1, float _2, float _3); +typedef double (STDCALL *_dCuffd)(U32 _0, float _1, float _2, double _3); +typedef double (STDCALL *_dCuffu)(U32 _0, float _1, float _2, U32 _3); +typedef double (STDCALL *_dCufdf)(U32 _0, float _1, double _2, float _3); +typedef double (STDCALL *_dCufdd)(U32 _0, float _1, double _2, double _3); +typedef double (STDCALL *_dCufdu)(U32 _0, float _1, double _2, U32 _3); +typedef double (STDCALL *_dCufuf)(U32 _0, float _1, U32 _2, float _3); +typedef double (STDCALL *_dCufud)(U32 _0, float _1, U32 _2, double _3); +typedef double (STDCALL *_dCufuu)(U32 _0, float _1, U32 _2, U32 _3); +typedef double (STDCALL *_dCudff)(U32 _0, double _1, float _2, float _3); +typedef double (STDCALL *_dCudfd)(U32 _0, double _1, float _2, double _3); +typedef double (STDCALL *_dCudfu)(U32 _0, double _1, float _2, U32 _3); +typedef double (STDCALL *_dCuddf)(U32 _0, double _1, double _2, float _3); +typedef double (STDCALL *_dCuddd)(U32 _0, double _1, double _2, double _3); +typedef double (STDCALL *_dCuddu)(U32 _0, double _1, double _2, U32 _3); +typedef double (STDCALL *_dCuduf)(U32 _0, double _1, U32 _2, float _3); +typedef double (STDCALL *_dCudud)(U32 _0, double _1, U32 _2, double _3); +typedef double (STDCALL *_dCuduu)(U32 _0, double _1, U32 _2, U32 _3); +typedef double (STDCALL *_dCuuff)(U32 _0, U32 _1, float _2, float _3); +typedef double (STDCALL *_dCuufd)(U32 _0, U32 _1, float _2, double _3); +typedef double (STDCALL *_dCuufu)(U32 _0, U32 _1, float _2, U32 _3); +typedef double (STDCALL *_dCuudf)(U32 _0, U32 _1, double _2, float _3); +typedef double (STDCALL *_dCuudd)(U32 _0, U32 _1, double _2, double _3); +typedef double (STDCALL *_dCuudu)(U32 _0, U32 _1, double _2, U32 _3); +typedef double (STDCALL *_dCuuuf)(U32 _0, U32 _1, U32 _2, float _3); +typedef double (STDCALL *_dCuuud)(U32 _0, U32 _1, U32 _2, double _3); +typedef double (STDCALL *_dCuuuu)(U32 _0, U32 _1, U32 _2, U32 _3); +typedef U64 (STDCALL *_uCffff)(float _0, float _1, float _2, float _3); +typedef U64 (STDCALL *_uCfffd)(float _0, float _1, float _2, double _3); +typedef U64 (STDCALL *_uCfffu)(float _0, float _1, float _2, U32 _3); +typedef U64 (STDCALL *_uCffdf)(float _0, float _1, double _2, float _3); +typedef U64 (STDCALL *_uCffdd)(float _0, float _1, double _2, double _3); +typedef U64 (STDCALL *_uCffdu)(float _0, float _1, double _2, U32 _3); +typedef U64 (STDCALL *_uCffuf)(float _0, float _1, U32 _2, float _3); +typedef U64 (STDCALL *_uCffud)(float _0, float _1, U32 _2, double _3); +typedef U64 (STDCALL *_uCffuu)(float _0, float _1, U32 _2, U32 _3); +typedef U64 (STDCALL *_uCfdff)(float _0, double _1, float _2, float _3); +typedef U64 (STDCALL *_uCfdfd)(float _0, double _1, float _2, double _3); +typedef U64 (STDCALL *_uCfdfu)(float _0, double _1, float _2, U32 _3); +typedef U64 (STDCALL *_uCfddf)(float _0, double _1, double _2, float _3); +typedef U64 (STDCALL *_uCfddd)(float _0, double _1, double _2, double _3); +typedef U64 (STDCALL *_uCfddu)(float _0, double _1, double _2, U32 _3); +typedef U64 (STDCALL *_uCfduf)(float _0, double _1, U32 _2, float _3); +typedef U64 (STDCALL *_uCfdud)(float _0, double _1, U32 _2, double _3); +typedef U64 (STDCALL *_uCfduu)(float _0, double _1, U32 _2, U32 _3); +typedef U64 (STDCALL *_uCfuff)(float _0, U32 _1, float _2, float _3); +typedef U64 (STDCALL *_uCfufd)(float _0, U32 _1, float _2, double _3); +typedef U64 (STDCALL *_uCfufu)(float _0, U32 _1, float _2, U32 _3); +typedef U64 (STDCALL *_uCfudf)(float _0, U32 _1, double _2, float _3); +typedef U64 (STDCALL *_uCfudd)(float _0, U32 _1, double _2, double _3); +typedef U64 (STDCALL *_uCfudu)(float _0, U32 _1, double _2, U32 _3); +typedef U64 (STDCALL *_uCfuuf)(float _0, U32 _1, U32 _2, float _3); +typedef U64 (STDCALL *_uCfuud)(float _0, U32 _1, U32 _2, double _3); +typedef U64 (STDCALL *_uCfuuu)(float _0, U32 _1, U32 _2, U32 _3); +typedef U64 (STDCALL *_uCdfff)(double _0, float _1, float _2, float _3); +typedef U64 (STDCALL *_uCdffd)(double _0, float _1, float _2, double _3); +typedef U64 (STDCALL *_uCdffu)(double _0, float _1, float _2, U32 _3); +typedef U64 (STDCALL *_uCdfdf)(double _0, float _1, double _2, float _3); +typedef U64 (STDCALL *_uCdfdd)(double _0, float _1, double _2, double _3); +typedef U64 (STDCALL *_uCdfdu)(double _0, float _1, double _2, U32 _3); +typedef U64 (STDCALL *_uCdfuf)(double _0, float _1, U32 _2, float _3); +typedef U64 (STDCALL *_uCdfud)(double _0, float _1, U32 _2, double _3); +typedef U64 (STDCALL *_uCdfuu)(double _0, float _1, U32 _2, U32 _3); +typedef U64 (STDCALL *_uCddff)(double _0, double _1, float _2, float _3); +typedef U64 (STDCALL *_uCddfd)(double _0, double _1, float _2, double _3); +typedef U64 (STDCALL *_uCddfu)(double _0, double _1, float _2, U32 _3); +typedef U64 (STDCALL *_uCdddf)(double _0, double _1, double _2, float _3); +typedef U64 (STDCALL *_uCdddd)(double _0, double _1, double _2, double _3); +typedef U64 (STDCALL *_uCdddu)(double _0, double _1, double _2, U32 _3); +typedef U64 (STDCALL *_uCdduf)(double _0, double _1, U32 _2, float _3); +typedef U64 (STDCALL *_uCddud)(double _0, double _1, U32 _2, double _3); +typedef U64 (STDCALL *_uCdduu)(double _0, double _1, U32 _2, U32 _3); +typedef U64 (STDCALL *_uCduff)(double _0, U32 _1, float _2, float _3); +typedef U64 (STDCALL *_uCdufd)(double _0, U32 _1, float _2, double _3); +typedef U64 (STDCALL *_uCdufu)(double _0, U32 _1, float _2, U32 _3); +typedef U64 (STDCALL *_uCdudf)(double _0, U32 _1, double _2, float _3); +typedef U64 (STDCALL *_uCdudd)(double _0, U32 _1, double _2, double _3); +typedef U64 (STDCALL *_uCdudu)(double _0, U32 _1, double _2, U32 _3); +typedef U64 (STDCALL *_uCduuf)(double _0, U32 _1, U32 _2, float _3); +typedef U64 (STDCALL *_uCduud)(double _0, U32 _1, U32 _2, double _3); +typedef U64 (STDCALL *_uCduuu)(double _0, U32 _1, U32 _2, U32 _3); +typedef U64 (STDCALL *_uCufff)(U32 _0, float _1, float _2, float _3); +typedef U64 (STDCALL *_uCuffd)(U32 _0, float _1, float _2, double _3); +typedef U64 (STDCALL *_uCuffu)(U32 _0, float _1, float _2, U32 _3); +typedef U64 (STDCALL *_uCufdf)(U32 _0, float _1, double _2, float _3); +typedef U64 (STDCALL *_uCufdd)(U32 _0, float _1, double _2, double _3); +typedef U64 (STDCALL *_uCufdu)(U32 _0, float _1, double _2, U32 _3); +typedef U64 (STDCALL *_uCufuf)(U32 _0, float _1, U32 _2, float _3); +typedef U64 (STDCALL *_uCufud)(U32 _0, float _1, U32 _2, double _3); +typedef U64 (STDCALL *_uCufuu)(U32 _0, float _1, U32 _2, U32 _3); +typedef U64 (STDCALL *_uCudff)(U32 _0, double _1, float _2, float _3); +typedef U64 (STDCALL *_uCudfd)(U32 _0, double _1, float _2, double _3); +typedef U64 (STDCALL *_uCudfu)(U32 _0, double _1, float _2, U32 _3); +typedef U64 (STDCALL *_uCuddf)(U32 _0, double _1, double _2, float _3); +typedef U64 (STDCALL *_uCuddd)(U32 _0, double _1, double _2, double _3); +typedef U64 (STDCALL *_uCuddu)(U32 _0, double _1, double _2, U32 _3); +typedef U64 (STDCALL *_uCuduf)(U32 _0, double _1, U32 _2, float _3); +typedef U64 (STDCALL *_uCudud)(U32 _0, double _1, U32 _2, double _3); +typedef U64 (STDCALL *_uCuduu)(U32 _0, double _1, U32 _2, U32 _3); +typedef U64 (STDCALL *_uCuuff)(U32 _0, U32 _1, float _2, float _3); +typedef U64 (STDCALL *_uCuufd)(U32 _0, U32 _1, float _2, double _3); +typedef U64 (STDCALL *_uCuufu)(U32 _0, U32 _1, float _2, U32 _3); +typedef U64 (STDCALL *_uCuudf)(U32 _0, U32 _1, double _2, float _3); +typedef U64 (STDCALL *_uCuudd)(U32 _0, U32 _1, double _2, double _3); +typedef U64 (STDCALL *_uCuudu)(U32 _0, U32 _1, double _2, U32 _3); +typedef U64 (STDCALL *_uCuuuf)(U32 _0, U32 _1, U32 _2, float _3); +typedef U64 (STDCALL *_uCuuud)(U32 _0, U32 _1, U32 _2, double _3); +typedef U64 (STDCALL *_uCuuuu)(U32 _0, U32 _1, U32 _2, U32 _3); diff --git a/dna/RVA.c b/dna/RVA.c new file mode 100644 index 0000000..82877d2 --- /dev/null +++ b/dna/RVA.c @@ -0,0 +1,72 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + + +#include "Compat.h" + +#include "RVA.h" + +tRVA* RVA() { + tRVA *pRet; + pRet = TMALLOC(tRVA); + return pRet; +} + +tRVA_Item* RVA_Create(tRVA *pThis, void *pFile, void *pSectionHeader) { + tRVA_Item* pRet; + unsigned int rawOfs; + unsigned int rawSize; + + pRet = TMALLOC(tRVA_Item); + pRet->baseAddress = *(unsigned int*)&((char*)pSectionHeader)[12]; + pRet->size = *(unsigned int*)&((char*)pSectionHeader)[8]; + pRet->pData = malloc(pRet->size); + memset(pRet->pData, 0, pRet->size); + pRet->pNext = pThis->pFirstRVA; + pThis->pFirstRVA = pRet; + + rawOfs = *(unsigned int*)&((char*)pSectionHeader)[20]; + rawSize = *(unsigned int*)&((char*)pSectionHeader)[16]; + if (rawOfs > 0) { + if (rawSize > pRet->size) { + rawSize = pRet->size; + } + memcpy(pRet->pData, ((char*)pFile)+rawOfs, rawSize); + } + + return pRet; +} + +void* RVA_FindData(tRVA *pThis, unsigned int rva) { + tRVA_Item *pRVA; + + if (rva == 0) { + return NULL; + } + + pRVA = pThis->pFirstRVA; + while (pRVA != NULL) { + if (rva >= pRVA->baseAddress && rva < pRVA->baseAddress+pRVA->size) { + return (char*)(pRVA->pData) + (rva - pRVA->baseAddress); + } + pRVA = pRVA->pNext; + } + return NULL; +} diff --git a/dna/RVA.h b/dna/RVA.h new file mode 100644 index 0000000..fc56601 --- /dev/null +++ b/dna/RVA.h @@ -0,0 +1,42 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined (__RVA_H) +#define __RVA_H + +typedef struct tRVA_Item_ tRVA_Item; +struct tRVA_Item_ { + unsigned int baseAddress; + unsigned int size; + void *pData; + + tRVA_Item *pNext; +}; + +typedef struct tRVA_ tRVA; +struct tRVA_ { + tRVA_Item *pFirstRVA; +}; + +tRVA* RVA(); +tRVA_Item* RVA_Create(tRVA *pThis, void *pFile, void *pSectionHeader); +void* RVA_FindData(tRVA *pThis, unsigned int rva); + +#endif diff --git a/dna/Sys.c b/dna/Sys.c new file mode 100644 index 0000000..e8519ea --- /dev/null +++ b/dna/Sys.c @@ -0,0 +1,144 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "MetaData.h" +#include "Types.h" + +void Crash(char *pMsg, ...) { + va_list va; + + printf("\n\n*** CRASH ***\n"); + + va_start(va, pMsg); + + vprintf(pMsg, va); + + va_end(va); + + printf("\n\n"); + +#ifdef WIN32 + { + // Cause a delibrate exception, to get into debugger + __debugbreak(); + } +#endif + + exit(1); +} + +U32 logLevel = 0; + +void log_f(U32 level, char *pMsg, ...) { + va_list va; + + if (logLevel >= level) { + va_start(va, pMsg); + vprintf(pMsg, va); + va_end(va); + } +} + +static char methodName[2048]; +char* Sys_GetMethodDesc(tMD_MethodDef *pMethod) { + U32 i; + + sprintf(methodName, "%s.%s.%s(", pMethod->pParentType->nameSpace, pMethod->pParentType->name, pMethod->name); + for (i=METHOD_ISSTATIC(pMethod)?0:1; inumberOfParameters; i++) { + if (i > (U32)(METHOD_ISSTATIC(pMethod)?0:1)) { + sprintf(strchr(methodName, 0), ","); + } + sprintf(strchr(methodName, 0), pMethod->pParams[i].pTypeDef->name); + } + sprintf(strchr(methodName, 0), ")"); + return methodName; +} + +static U32 mallocForeverSize = 0; +// malloc() some memory that will never need to be resized or freed. +void* mallocForever(U32 size) { + mallocForeverSize += size; +log_f(3, "--- mallocForever: TotalSize %d\n", mallocForeverSize); + return malloc(size); +} + +/* +#ifdef _DEBUG +void* mallocTrace(int s, char *pFile, int line) { + //printf("MALLOC: %s:%d %d\n", pFile, line, s); +#undef malloc + return malloc(s); +} +#endif +*/ + +U64 msTime() { +#ifdef WIN32 + static LARGE_INTEGER freq = {0,0}; + LARGE_INTEGER time; + if (freq.QuadPart == 0) { + QueryPerformanceFrequency(&freq); + } + QueryPerformanceCounter(&time); + return (time.QuadPart * 1000) / freq.QuadPart; +#else + struct timeval tp; + U64 ms; + gettimeofday(&tp,NULL); + ms = tp.tv_sec; + ms *= 1000; + ms += ((U64)tp.tv_usec)/((U64)1000); + return ms; +#endif +} + +#if defined(DIAG_METHOD_CALLS) || defined(DIAG_OPCODE_TIMES) || defined(DIAG_GC) || defined(DIAG_TOTAL_TIME) +U64 microTime() { +#ifdef WIN32 + static LARGE_INTEGER freq = {0,0}; + LARGE_INTEGER time; + if (freq.QuadPart == 0) { + QueryPerformanceFrequency(&freq); + } + QueryPerformanceCounter(&time); + return (time.QuadPart * 1000000) / freq.QuadPart; +#else + struct timeval tp; + U64 ms; + gettimeofday(&tp,NULL); + ms = tp.tv_sec; + ms *= 1000000; + ms += ((U64)tp.tv_usec); + return ms; +#endif +} +#endif + +void SleepMS(U32 ms) { +#ifdef WIN32 + Sleep(ms); +#else + sleep(ms / 1000); + usleep((ms % 1000) * 1000); +#endif +} \ No newline at end of file diff --git a/dna/Sys.h b/dna/Sys.h new file mode 100644 index 0000000..d4b7c1b --- /dev/null +++ b/dna/Sys.h @@ -0,0 +1,58 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYS_H) +#define __SYS_H + +#include "Config.h" + +/*#ifdef _DEBUG +void* mallocTrace(int s, char *pFile, int line); +#define malloc(s) mallocTrace(s, __FILE__, __LINE__) +#endif*/ + +#ifdef _DEBUG +#define Assert(cond) if (!(cond)) Crash("Assert failed: %s, line %d", __FILE__, __LINE__); +#else +#define Assert(cond) +#endif + +#define FAKE_RETURN exit(101) + +#define INTERNALCALL_PARAM(ofs, type) *(type*)(pParams + ofs) + +#include "MetaData.h" + +void Crash(char *pMsg, ...); + +extern U32 logLevel; +void log_f(U32 level, char *pMsg, ...); + +char* Sys_GetMethodDesc(tMD_MethodDef *pMethod); + +void* mallocForever(U32 size); + +U64 msTime(); +#if defined(DIAG_METHOD_CALLS) || defined(DIAG_OPCODE_TIMES) || defined(DIAG_GC) || defined(DIAG_TOTAL_TIME) +U64 microTime(); +#endif +void SleepMS(U32 ms); + +#endif diff --git a/dna/System.Array.c b/dna/System.Array.c new file mode 100644 index 0000000..5113b1e --- /dev/null +++ b/dna/System.Array.c @@ -0,0 +1,327 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Array.h" + +#include "Types.h" +#include "MetaData.h" +#include "Heap.h" +#include "Type.h" + +typedef struct tSystemArray_ tSystemArray; +struct tSystemArray_ { + // How many elements in array + U32 length; + // The elements + U8 elements[0]; +}; + +// Must return a boxed version of value-types +tAsyncCall* System_Array_Internal_GetValue(PTR pThis_, PTR pParams, PTR pReturnValue) { + tSystemArray *pArray = (tSystemArray*)pThis_; + tMD_TypeDef *pArrayType; + U32 index, elementSize; + tMD_TypeDef *pElementType; + PTR pElement; + + index = *(U32*)pParams; + pArrayType = Heap_GetType(pThis_); + pElementType = pArrayType->pArrayElementType; + elementSize = pElementType->arrayElementSize; + pElement = pArray->elements + elementSize * index; + if (pElementType->isValueType) { + // If it's a value-type, then box it + HEAP_PTR boxedValue; + if (pElementType->pGenericDefinition == types[TYPE_SYSTEM_NULLABLE]) { + // Nullable type, so box specially + if (*(U32*)pElement) { + // Nullable has value + boxedValue = Heap_AllocType(pElementType->ppClassTypeArgs[0]); + // Don't copy the .hasValue part + memcpy(boxedValue, pElement + 4, elementSize - 4); + } else { + // Nullable does not have value + boxedValue = NULL; + } + } else { + boxedValue = Heap_AllocType(pElementType); + memcpy(boxedValue, pElement, elementSize); + } + *(HEAP_PTR*)pReturnValue = boxedValue; + } else { + // This must be a reference type, so it must be 32-bits wide + *(U32*)pReturnValue = *(U32*)pElement; + } + + return NULL; +} + +// Value-types will be boxed +tAsyncCall* System_Array_Internal_SetValue(PTR pThis_, PTR pParams, PTR pReturnValue) { + tSystemArray *pArray = (tSystemArray*)pThis_; + tMD_TypeDef *pArrayType, *pObjType; + U32 index, elementSize; + HEAP_PTR obj; + tMD_TypeDef *pElementType; + PTR pElement; + + pArrayType = Heap_GetType(pThis_); + obj = ((HEAP_PTR*)pParams)[0]; + pObjType = Heap_GetType(obj); + pElementType = pArrayType->pArrayElementType; + // Check to see if the Type is ok to put in the array + if (!(Type_IsAssignableFrom(pElementType, pObjType) || + (pElementType->pGenericDefinition == types[TYPE_SYSTEM_NULLABLE] && + pElementType->ppClassTypeArgs[0] == pObjType))) { + // Can't be done + *(U32*)pReturnValue = 0; + return NULL; + } + + index = ((U32*)pParams)[1]; + +#if defined(WIN32) && defined(_DEBUG) + // Do a bounds-check + if (index >= pArray->length) { + printf("[Array] Internal_SetValue() Bounds-check failed\n"); + __debugbreak(); + } +#endif + + elementSize = pElementType->arrayElementSize; + pElement = pArray->elements + elementSize * index; + if (pElementType->isValueType) { + if (pElementType->pGenericDefinition == types[TYPE_SYSTEM_NULLABLE]) { + // Nullable type, so treat specially + if (obj == NULL) { + memset(pElement, 0, elementSize); + } else { + *(U32*)pElement = 1; + memcpy(pElement + 4, obj, elementSize - 4); + } + } else { + // Get the value out of the box + memcpy(pElement, obj, elementSize); + } + } else { + // This must be a reference type, so it must be 32-bits wide + *(HEAP_PTR*)pElement = obj; + } + *(U32*)pReturnValue = 1; + + return NULL; +} + +tAsyncCall* System_Array_Clear(PTR pThis_, PTR pParams, PTR pReturnValue) { + tSystemArray *pArray; + U32 index, length, elementSize; + tMD_TypeDef *pArrayType; + + pArray = ((tSystemArray**)pParams)[0]; + index = ((U32*)pParams)[1]; + length = ((U32*)pParams)[2]; + pArrayType = Heap_GetType((HEAP_PTR)pArray); + elementSize = pArrayType->pArrayElementType->arrayElementSize; + memset(pArray->elements + index * elementSize, 0, length * elementSize); + + return NULL; +} + +tAsyncCall* System_Array_Internal_Copy(PTR pThis_, PTR pParams, PTR pReturnValue) { + tSystemArray *pSrc, *pDst; + tMD_TypeDef *pSrcType, *pDstType, *pSrcElementType; + + pSrc = ((tSystemArray**)pParams)[0]; + pDst = ((tSystemArray**)pParams)[2]; + + // Check if we can do a fast-copy with these two arrays + pSrcType = Heap_GetType((HEAP_PTR)pSrc); + pDstType = Heap_GetType((HEAP_PTR)pDst); + pSrcElementType = pSrcType->pArrayElementType; + if (Type_IsAssignableFrom(pDstType->pArrayElementType, pSrcElementType)) { + // Can do fast-copy + U32 srcIndex, dstIndex, length, elementSize; + + srcIndex = ((U32*)pParams)[1]; + dstIndex = ((U32*)pParams)[3]; + length = ((U32*)pParams)[4]; + +#if defined(WIN32) && defined(_DEBUG) + // Do bounds check + if (srcIndex + length > pSrc->length || dstIndex + length > pDst->length) { + printf("[Array] Internal_Copy() Bounds check failed\n"); + __debugbreak(); + } +#endif + + elementSize = pSrcElementType->arrayElementSize; + + memcpy(pDst->elements + dstIndex * elementSize, pSrc->elements + srcIndex * elementSize, length * elementSize); + + *(U32*)pReturnValue = 1; + } else { + // Cannot do fast-copy + *(U32*)pReturnValue = 0; + } + + return NULL; +} + +tAsyncCall* System_Array_Resize(PTR pThis_, PTR pParams, PTR pReturnValue) { + HEAP_PTR* ppArray_, pHeap; + tSystemArray *pOldArray, *pNewArray; + U32 newSize, oldSize; + tMD_TypeDef *pArrayTypeDef; + + ppArray_ = ((HEAP_PTR**)pParams)[0]; + newSize = ((U32*)pParams)[1]; + + pOldArray = (tSystemArray*)*ppArray_; + oldSize = pOldArray->length; + + if (oldSize == newSize) { + // Do nothing if new length equals the current length. + return NULL; + } + + pArrayTypeDef = Heap_GetType(*ppArray_); + pHeap = SystemArray_NewVector(pArrayTypeDef, newSize); + pNewArray = (tSystemArray*)pHeap; + *ppArray_ = pHeap; + memcpy(pNewArray->elements, pOldArray->elements, + pArrayTypeDef->pArrayElementType->arrayElementSize * ((newSizepArrayElementType->arrayElementSize; + + pE1 = pArray->elements + index * elementSize; + pE2 = pArray->elements + (index + length - 1) * elementSize; + dec = elementSize << 1; + + while (pE2 > pE1) { + for (i=elementSize; i>0; i--) { + U8 c = *pE1; + *pE1++ = *pE2; + *pE2++ = c; + } + pE2 -= dec; + } + + return NULL; +} + +HEAP_PTR SystemArray_NewVector(tMD_TypeDef *pArrayTypeDef, U32 length) { + U32 heapSize; + tSystemArray *pArray; + + heapSize = sizeof(tSystemArray) + length * pArrayTypeDef->pArrayElementType->arrayElementSize; + pArray = (tSystemArray*)Heap_Alloc(pArrayTypeDef, heapSize); + pArray->length = length; + return (HEAP_PTR)pArray; +} + +void SystemArray_StoreElement(HEAP_PTR pThis_, U32 index, PTR value) { + tSystemArray *pArray = (tSystemArray*)pThis_; + tMD_TypeDef *pArrayTypeDef; + U32 elemSize; + +#if defined(WIN32) && defined(_DEBUG) + // Do a bounds check + if (index >= pArray->length) { + printf("SystemArray_StoreElement() Bounds check failed. Array length: %d index: %d\n", pArray->length, index); + __debugbreak(); + } +#endif + + pArrayTypeDef = Heap_GetType(pThis_); + elemSize = pArrayTypeDef->pArrayElementType->arrayElementSize; + switch (elemSize) { + case 1: + ((U8*)(pArray->elements))[index] = *(U8*)value; + break; + case 2: + ((U16*)(pArray->elements))[index] = *(U16*)value; + break; + case 4: + ((U32*)(pArray->elements))[index] = *(U32*)value; + break; + default: + memcpy(&pArray->elements[index * elemSize], value, elemSize); + break; + } +} + +void SystemArray_LoadElement(HEAP_PTR pThis_, U32 index, PTR value) { + tSystemArray *pArray = (tSystemArray*)pThis_; + tMD_TypeDef *pArrayTypeDef; + U32 elemSize; + + pArrayTypeDef = Heap_GetType(pThis_); + elemSize = pArrayTypeDef->pArrayElementType->arrayElementSize; + switch (elemSize) { + case 1: + *(U8*)value =((U8*)(pArray->elements))[index]; + break; + case 2: + *(U16*)value = ((U16*)(pArray->elements))[index]; + break; + case 4: + *(U32*)value = ((U32*)(pArray->elements))[index]; + break; + default: + memcpy(value, &pArray->elements[index * elemSize], elemSize); + break; + } +} + +PTR SystemArray_LoadElementAddress(HEAP_PTR pThis_, U32 index) { + tSystemArray *pArray = (tSystemArray*)pThis_; + tMD_TypeDef *pArrayTypeDef; + +#if defined(WIN32) && defined(_DEBUG) + if (index >= pArray->length) { + printf("SystemArray_LoadElementAddress() Bounds check failed\n"); + __debugbreak(); + } +#endif + + pArrayTypeDef = Heap_GetType(pThis_); + return pArray->elements + pArrayTypeDef->pArrayElementType->arrayElementSize * index; +} + +U32 SystemArray_GetNumBytes(HEAP_PTR pThis_, tMD_TypeDef *pElementType) { + return (((tSystemArray*)pThis_)->length * pElementType->arrayElementSize) + sizeof(tSystemArray); +} \ No newline at end of file diff --git a/dna/System.Array.h b/dna/System.Array.h new file mode 100644 index 0000000..8dfea41 --- /dev/null +++ b/dna/System.Array.h @@ -0,0 +1,41 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_ARRAY_H) +#define __SYSTEM_ARRAY_H + +#include "MetaData.h" +#include "Types.h" + +tAsyncCall* System_Array_Internal_GetValue(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Array_Internal_SetValue(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Array_Clear(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Array_Internal_Copy(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Array_Resize(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Array_Reverse(PTR pThis_, PTR pParams, PTR pReturnValue); + +HEAP_PTR SystemArray_NewVector(tMD_TypeDef *pArrayTypeDef, U32 length); +#define SystemArray_GetLength(pArray) (*(U32*)(pArray)) +void SystemArray_StoreElement(HEAP_PTR pThis_, U32 index, PTR value); +void SystemArray_LoadElement(HEAP_PTR pThis_, U32 index, PTR value); +#define SystemArray_GetElements(pArray) ((PTR)(((PTR)pArray)+4)) +PTR SystemArray_LoadElementAddress(HEAP_PTR pThis_, U32 index); +U32 SystemArray_GetNumBytes(HEAP_PTR pThis_, tMD_TypeDef *pElementType); +#endif \ No newline at end of file diff --git a/dna/System.Char.CaseConversion.h b/dna/System.Char.CaseConversion.h new file mode 100644 index 0000000..3925a4f --- /dev/null +++ b/dna/System.Char.CaseConversion.h @@ -0,0 +1,196 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +static unsigned short UC_CaseLower[] = { + 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, // 0000 + 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f, 0x0070, // 0008 + 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, // 0010 + 0x0079, 0x007a, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, // 0018 + 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, // 0020 + 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, // 0028 + 0x00f6, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, // 0030 + 0x0101, 0x0103, 0x0105, 0x0107, 0x0109, 0x010b, 0x010d, 0x010f, // 0038 + 0x0111, 0x0113, 0x0115, 0x0117, 0x0119, 0x011b, 0x011d, 0x011f, // 0040 + 0x0121, 0x0123, 0x0125, 0x0127, 0x0129, 0x012b, 0x012d, 0x012f, // 0048 + 0x0133, 0x0135, 0x0137, 0x013a, 0x013c, 0x013e, 0x0140, 0x0142, // 0050 + 0x0144, 0x0146, 0x0148, 0x014b, 0x014d, 0x014f, 0x0151, 0x0153, // 0058 + 0x0155, 0x0157, 0x0159, 0x015b, 0x015d, 0x015f, 0x0161, 0x0163, // 0060 + 0x0165, 0x0167, 0x0169, 0x016b, 0x016d, 0x016f, 0x0171, 0x0173, // 0068 + 0x0175, 0x0177, 0x00ff, 0x017a, 0x017c, 0x017e, 0x0253, 0x0183, // 0070 + 0x0185, 0x0254, 0x0188, 0x0256, 0x0257, 0x018c, 0x01dd, 0x0259, // 0078 + 0x025b, 0x0192, 0x0260, 0x0263, 0x0269, 0x0268, 0x0199, 0x026f, // 0080 + 0x0272, 0x0275, 0x01a1, 0x01a3, 0x01a5, 0x01a8, 0x0283, 0x01ad, // 0088 + 0x0288, 0x01b0, 0x028a, 0x028b, 0x01b4, 0x01b6, 0x0292, 0x01b9, // 0090 + 0x01bd, 0x01c6, 0x01c9, 0x01cc, 0x01ce, 0x01d0, 0x01d2, 0x01d4, // 0098 + 0x01d6, 0x01d8, 0x01da, 0x01dc, 0x01df, 0x01e1, 0x01e3, 0x01e5, // 00a0 + 0x01e7, 0x01e9, 0x01eb, 0x01ed, 0x01ef, 0x01f3, 0x01f5, 0x01fb, // 00a8 + 0x01fd, 0x01ff, 0x0201, 0x0203, 0x0205, 0x0207, 0x0209, 0x020b, // 00b0 + 0x020d, 0x020f, 0x0211, 0x0213, 0x0215, 0x0217, 0x03ac, 0x03ad, // 00b8 + 0x03ae, 0x03af, 0x03cc, 0x03cd, 0x03ce, 0x03b1, 0x03b2, 0x03b3, // 00c0 + 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, // 00c8 + 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c3, 0x03c4, // 00d0 + 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03e3, // 00d8 + 0x03e5, 0x03e7, 0x03e9, 0x03eb, 0x03ed, 0x03ef, 0x0451, 0x0452, // 00e0 + 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, // 00e8 + 0x045b, 0x045c, 0x045e, 0x045f, 0x0430, 0x0431, 0x0432, 0x0433, // 00f0 + 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, // 00f8 + 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, // 0100 + 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, // 0108 + 0x044c, 0x044d, 0x044e, 0x044f, 0x0461, 0x0463, 0x0465, 0x0467, // 0110 + 0x0469, 0x046b, 0x046d, 0x046f, 0x0471, 0x0473, 0x0475, 0x0477, // 0118 + 0x0479, 0x047b, 0x047d, 0x047f, 0x0481, 0x0491, 0x0493, 0x0495, // 0120 + 0x0497, 0x0499, 0x049b, 0x049d, 0x049f, 0x04a1, 0x04a3, 0x04a5, // 0128 + 0x04a7, 0x04a9, 0x04ab, 0x04ad, 0x04af, 0x04b1, 0x04b3, 0x04b5, // 0130 + 0x04b7, 0x04b9, 0x04bb, 0x04bd, 0x04bf, 0x04c2, 0x04c4, 0x04c8, // 0138 + 0x04cc, 0x04d1, 0x04d3, 0x04d5, 0x04d7, 0x04d9, 0x04db, 0x04dd, // 0140 + 0x04df, 0x04e1, 0x04e3, 0x04e5, 0x04e7, 0x04e9, 0x04eb, 0x04ef, // 0148 + 0x04f1, 0x04f3, 0x04f5, 0x04f9, 0x0561, 0x0562, 0x0563, 0x0564, // 0150 + 0x0565, 0x0566, 0x0567, 0x0568, 0x0569, 0x056a, 0x056b, 0x056c, // 0158 + 0x056d, 0x056e, 0x056f, 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, // 0160 + 0x0575, 0x0576, 0x0577, 0x0578, 0x0579, 0x057a, 0x057b, 0x057c, // 0168 + 0x057d, 0x057e, 0x057f, 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, // 0170 + 0x0585, 0x0586, 0x10d0, 0x10d1, 0x10d2, 0x10d3, 0x10d4, 0x10d5, // 0178 + 0x10d6, 0x10d7, 0x10d8, 0x10d9, 0x10da, 0x10db, 0x10dc, 0x10dd, // 0180 + 0x10de, 0x10df, 0x10e0, 0x10e1, 0x10e2, 0x10e3, 0x10e4, 0x10e5, // 0188 + 0x10e6, 0x10e7, 0x10e8, 0x10e9, 0x10ea, 0x10eb, 0x10ec, 0x10ed, // 0190 + 0x10ee, 0x10ef, 0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, // 0198 + 0x1e01, 0x1e03, 0x1e05, 0x1e07, 0x1e09, 0x1e0b, 0x1e0d, 0x1e0f, // 01a0 + 0x1e11, 0x1e13, 0x1e15, 0x1e17, 0x1e19, 0x1e1b, 0x1e1d, 0x1e1f, // 01a8 + 0x1e21, 0x1e23, 0x1e25, 0x1e27, 0x1e29, 0x1e2b, 0x1e2d, 0x1e2f, // 01b0 + 0x1e31, 0x1e33, 0x1e35, 0x1e37, 0x1e39, 0x1e3b, 0x1e3d, 0x1e3f, // 01b8 + 0x1e41, 0x1e43, 0x1e45, 0x1e47, 0x1e49, 0x1e4b, 0x1e4d, 0x1e4f, // 01c0 + 0x1e51, 0x1e53, 0x1e55, 0x1e57, 0x1e59, 0x1e5b, 0x1e5d, 0x1e5f, // 01c8 + 0x1e61, 0x1e63, 0x1e65, 0x1e67, 0x1e69, 0x1e6b, 0x1e6d, 0x1e6f, // 01d0 + 0x1e71, 0x1e73, 0x1e75, 0x1e77, 0x1e79, 0x1e7b, 0x1e7d, 0x1e7f, // 01d8 + 0x1e81, 0x1e83, 0x1e85, 0x1e87, 0x1e89, 0x1e8b, 0x1e8d, 0x1e8f, // 01e0 + 0x1e91, 0x1e93, 0x1e95, 0x1ea1, 0x1ea3, 0x1ea5, 0x1ea7, 0x1ea9, // 01e8 + 0x1eab, 0x1ead, 0x1eaf, 0x1eb1, 0x1eb3, 0x1eb5, 0x1eb7, 0x1eb9, // 01f0 + 0x1ebb, 0x1ebd, 0x1ebf, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ec7, 0x1ec9, // 01f8 + 0x1ecb, 0x1ecd, 0x1ecf, 0x1ed1, 0x1ed3, 0x1ed5, 0x1ed7, 0x1ed9, // 0200 + 0x1edb, 0x1edd, 0x1edf, 0x1ee1, 0x1ee3, 0x1ee5, 0x1ee7, 0x1ee9, // 0208 + 0x1eeb, 0x1eed, 0x1eef, 0x1ef1, 0x1ef3, 0x1ef5, 0x1ef7, 0x1ef9, // 0210 + 0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07, // 0218 + 0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0x1f20, 0x1f21, // 0220 + 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27, 0x1f30, 0x1f31, // 0228 + 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37, 0x1f40, 0x1f41, // 0230 + 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0x1f51, 0x1f53, 0x1f55, 0x1f57, // 0238 + 0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67, // 0240 + 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0x1f72, 0x1f73, 0x1f74, 0x1f75, // 0248 + 0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0x1fe0, 0x1fe1, 0x1f7a, 0x1f7b, // 0250 + 0x1fe5, 0x1f78, 0x1f79, 0x1f7c, 0x1f7d, 0x2170, 0x2171, 0x2172, // 0258 + 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217a, // 0260 + 0x217b, 0x217c, 0x217d, 0x217e, 0x217f, 0x24d0, 0x24d1, 0x24d2, // 0268 + 0x24d3, 0x24d4, 0x24d5, 0x24d6, 0x24d7, 0x24d8, 0x24d9, 0x24da, // 0270 + 0x24db, 0x24dc, 0x24dd, 0x24de, 0x24df, 0x24e0, 0x24e1, 0x24e2, // 0278 + 0x24e3, 0x24e4, 0x24e5, 0x24e6, 0x24e7, 0x24e8, 0x24e9, 0xff41, // 0280 + 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49, // 0288 + 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51, // 0290 + 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57, 0xff58, 0xff59, // 0298 + 0xff5a, 0xffff +}; + +static unsigned short UC_CaseUpper[] = { + 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, // 0000 + 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, // 0008 + 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, // 0010 + 0x0059, 0x005a, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, // 0018 + 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, // 0020 + 0x00ce, 0x00cf, 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, // 0028 + 0x00d6, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, // 0030 + 0x0100, 0x0102, 0x0104, 0x0106, 0x0108, 0x010a, 0x010c, 0x010e, // 0038 + 0x0110, 0x0112, 0x0114, 0x0116, 0x0118, 0x011a, 0x011c, 0x011e, // 0040 + 0x0120, 0x0122, 0x0124, 0x0126, 0x0128, 0x012a, 0x012c, 0x012e, // 0048 + 0x0132, 0x0134, 0x0136, 0x0139, 0x013b, 0x013d, 0x013f, 0x0141, // 0050 + 0x0143, 0x0145, 0x0147, 0x014a, 0x014c, 0x014e, 0x0150, 0x0152, // 0058 + 0x0154, 0x0156, 0x0158, 0x015a, 0x015c, 0x015e, 0x0160, 0x0162, // 0060 + 0x0164, 0x0166, 0x0168, 0x016a, 0x016c, 0x016e, 0x0170, 0x0172, // 0068 + 0x0174, 0x0176, 0x0178, 0x0179, 0x017b, 0x017d, 0x0181, 0x0182, // 0070 + 0x0184, 0x0186, 0x0187, 0x0189, 0x018a, 0x018b, 0x018e, 0x018f, // 0078 + 0x0190, 0x0191, 0x0193, 0x0194, 0x0196, 0x0197, 0x0198, 0x019c, // 0080 + 0x019d, 0x019f, 0x01a0, 0x01a2, 0x01a4, 0x01a7, 0x01a9, 0x01ac, // 0088 + 0x01ae, 0x01af, 0x01b1, 0x01b2, 0x01b3, 0x01b5, 0x01b7, 0x01b8, // 0090 + 0x01bc, 0x01c4, 0x01c7, 0x01ca, 0x01cd, 0x01cf, 0x01d1, 0x01d3, // 0098 + 0x01d5, 0x01d7, 0x01d9, 0x01db, 0x01de, 0x01e0, 0x01e2, 0x01e4, // 00a0 + 0x01e6, 0x01e8, 0x01ea, 0x01ec, 0x01ee, 0x01f1, 0x01f4, 0x01fa, // 00a8 + 0x01fc, 0x01fe, 0x0200, 0x0202, 0x0204, 0x0206, 0x0208, 0x020a, // 00b0 + 0x020c, 0x020e, 0x0210, 0x0212, 0x0214, 0x0216, 0x0386, 0x0388, // 00b8 + 0x0389, 0x038a, 0x038c, 0x038e, 0x038f, 0x0391, 0x0392, 0x0393, // 00c0 + 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, // 00c8 + 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a3, 0x03a4, // 00d0 + 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03e2, // 00d8 + 0x03e4, 0x03e6, 0x03e8, 0x03ea, 0x03ec, 0x03ee, 0x0401, 0x0402, // 00e0 + 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, // 00e8 + 0x040b, 0x040c, 0x040e, 0x040f, 0x0410, 0x0411, 0x0412, 0x0413, // 00f0 + 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, // 00f8 + 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422, 0x0423, // 0100 + 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, // 0108 + 0x042c, 0x042d, 0x042e, 0x042f, 0x0460, 0x0462, 0x0464, 0x0466, // 0110 + 0x0468, 0x046a, 0x046c, 0x046e, 0x0470, 0x0472, 0x0474, 0x0476, // 0118 + 0x0478, 0x047a, 0x047c, 0x047e, 0x0480, 0x0490, 0x0492, 0x0494, // 0120 + 0x0496, 0x0498, 0x049a, 0x049c, 0x049e, 0x04a0, 0x04a2, 0x04a4, // 0128 + 0x04a6, 0x04a8, 0x04aa, 0x04ac, 0x04ae, 0x04b0, 0x04b2, 0x04b4, // 0130 + 0x04b6, 0x04b8, 0x04ba, 0x04bc, 0x04be, 0x04c1, 0x04c3, 0x04c7, // 0138 + 0x04cb, 0x04d0, 0x04d2, 0x04d4, 0x04d6, 0x04d8, 0x04da, 0x04dc, // 0140 + 0x04de, 0x04e0, 0x04e2, 0x04e4, 0x04e6, 0x04e8, 0x04ea, 0x04ee, // 0148 + 0x04f0, 0x04f2, 0x04f4, 0x04f8, 0x0531, 0x0532, 0x0533, 0x0534, // 0150 + 0x0535, 0x0536, 0x0537, 0x0538, 0x0539, 0x053a, 0x053b, 0x053c, // 0158 + 0x053d, 0x053e, 0x053f, 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, // 0160 + 0x0545, 0x0546, 0x0547, 0x0548, 0x0549, 0x054a, 0x054b, 0x054c, // 0168 + 0x054d, 0x054e, 0x054f, 0x0550, 0x0551, 0x0552, 0x0553, 0x0554, // 0170 + 0x0555, 0x0556, 0x10a0, 0x10a1, 0x10a2, 0x10a3, 0x10a4, 0x10a5, // 0178 + 0x10a6, 0x10a7, 0x10a8, 0x10a9, 0x10aa, 0x10ab, 0x10ac, 0x10ad, // 0180 + 0x10ae, 0x10af, 0x10b0, 0x10b1, 0x10b2, 0x10b3, 0x10b4, 0x10b5, // 0188 + 0x10b6, 0x10b7, 0x10b8, 0x10b9, 0x10ba, 0x10bb, 0x10bc, 0x10bd, // 0190 + 0x10be, 0x10bf, 0x10c0, 0x10c1, 0x10c2, 0x10c3, 0x10c4, 0x10c5, // 0198 + 0x1e00, 0x1e02, 0x1e04, 0x1e06, 0x1e08, 0x1e0a, 0x1e0c, 0x1e0e, // 01a0 + 0x1e10, 0x1e12, 0x1e14, 0x1e16, 0x1e18, 0x1e1a, 0x1e1c, 0x1e1e, // 01a8 + 0x1e20, 0x1e22, 0x1e24, 0x1e26, 0x1e28, 0x1e2a, 0x1e2c, 0x1e2e, // 01b0 + 0x1e30, 0x1e32, 0x1e34, 0x1e36, 0x1e38, 0x1e3a, 0x1e3c, 0x1e3e, // 01b8 + 0x1e40, 0x1e42, 0x1e44, 0x1e46, 0x1e48, 0x1e4a, 0x1e4c, 0x1e4e, // 01c0 + 0x1e50, 0x1e52, 0x1e54, 0x1e56, 0x1e58, 0x1e5a, 0x1e5c, 0x1e5e, // 01c8 + 0x1e60, 0x1e62, 0x1e64, 0x1e66, 0x1e68, 0x1e6a, 0x1e6c, 0x1e6e, // 01d0 + 0x1e70, 0x1e72, 0x1e74, 0x1e76, 0x1e78, 0x1e7a, 0x1e7c, 0x1e7e, // 01d8 + 0x1e80, 0x1e82, 0x1e84, 0x1e86, 0x1e88, 0x1e8a, 0x1e8c, 0x1e8e, // 01e0 + 0x1e90, 0x1e92, 0x1e94, 0x1ea0, 0x1ea2, 0x1ea4, 0x1ea6, 0x1ea8, // 01e8 + 0x1eaa, 0x1eac, 0x1eae, 0x1eb0, 0x1eb2, 0x1eb4, 0x1eb6, 0x1eb8, // 01f0 + 0x1eba, 0x1ebc, 0x1ebe, 0x1ec0, 0x1ec2, 0x1ec4, 0x1ec6, 0x1ec8, // 01f8 + 0x1eca, 0x1ecc, 0x1ece, 0x1ed0, 0x1ed2, 0x1ed4, 0x1ed6, 0x1ed8, // 0200 + 0x1eda, 0x1edc, 0x1ede, 0x1ee0, 0x1ee2, 0x1ee4, 0x1ee6, 0x1ee8, // 0208 + 0x1eea, 0x1eec, 0x1eee, 0x1ef0, 0x1ef2, 0x1ef4, 0x1ef6, 0x1ef8, // 0210 + 0x1f08, 0x1f09, 0x1f0a, 0x1f0b, 0x1f0c, 0x1f0d, 0x1f0e, 0x1f0f, // 0218 + 0x1f18, 0x1f19, 0x1f1a, 0x1f1b, 0x1f1c, 0x1f1d, 0x1f28, 0x1f29, // 0220 + 0x1f2a, 0x1f2b, 0x1f2c, 0x1f2d, 0x1f2e, 0x1f2f, 0x1f38, 0x1f39, // 0228 + 0x1f3a, 0x1f3b, 0x1f3c, 0x1f3d, 0x1f3e, 0x1f3f, 0x1f48, 0x1f49, // 0230 + 0x1f4a, 0x1f4b, 0x1f4c, 0x1f4d, 0x1f59, 0x1f5b, 0x1f5d, 0x1f5f, // 0238 + 0x1f68, 0x1f69, 0x1f6a, 0x1f6b, 0x1f6c, 0x1f6d, 0x1f6e, 0x1f6f, // 0240 + 0x1fb8, 0x1fb9, 0x1fba, 0x1fbb, 0x1fc8, 0x1fc9, 0x1fca, 0x1fcb, // 0248 + 0x1fd8, 0x1fd9, 0x1fda, 0x1fdb, 0x1fe8, 0x1fe9, 0x1fea, 0x1feb, // 0250 + 0x1fec, 0x1ff8, 0x1ff9, 0x1ffa, 0x1ffb, 0x2160, 0x2161, 0x2162, // 0258 + 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216a, // 0260 + 0x216b, 0x216c, 0x216d, 0x216e, 0x216f, 0x24b6, 0x24b7, 0x24b8, // 0268 + 0x24b9, 0x24ba, 0x24bb, 0x24bc, 0x24bd, 0x24be, 0x24bf, 0x24c0, // 0270 + 0x24c1, 0x24c2, 0x24c3, 0x24c4, 0x24c5, 0x24c6, 0x24c7, 0x24c8, // 0278 + 0x24c9, 0x24ca, 0x24cb, 0x24cc, 0x24cd, 0x24ce, 0x24cf, 0xff21, // 0280 + 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, // 0288 + 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, // 0290 + 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, // 0298 + 0xff3a, 0xffff +}; + diff --git a/dna/System.Char.UC_IndexRuns.h b/dna/System.Char.UC_IndexRuns.h new file mode 100644 index 0000000..b7d8cb0 --- /dev/null +++ b/dna/System.Char.UC_IndexRuns.h @@ -0,0 +1,288 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +static unsigned short UC_Index[] = { + 0x0000, 0x000e, 0x0020, 0x8000, 0x0030, 0x0008, 0x003a, 0x8010, // 0000 + 0x0041, 0x0000, 0x005b, 0x8017, 0x0061, 0x0001, 0x007b, 0x801d, // 0004 + 0x007f, 0x000e, 0x00a0, 0x8021, 0x00c0, 0x0000, 0x00d7, 0x800b, // 0008 + 0x00d8, 0x0000, 0x00df, 0x0001, 0x00f7, 0x800b, 0x00f8, 0x0001, // 000c + 0x0100, 0x8041, 0x0234, 0x001d, 0x0250, 0x0001, 0x02ae, 0x8161, // 0010 + 0x02b0, 0x0003, 0x02b9, 0x8175, 0x02bb, 0x0003, 0x02c2, 0x001b, // 0014 + 0x02d0, 0x8177, 0x02d2, 0x001b, 0x02e0, 0x0003, 0x02e5, 0x001b, // 0018 + 0x02ee, 0x8177, 0x02ef, 0x001d, 0x0300, 0x0005, 0x034f, 0x001d, // 001c + 0x0360, 0x8179, 0x0363, 0x001d, 0x0374, 0x817c, 0x037f, 0x001d, // 0020 + 0x0384, 0x8187, 0x0391, 0x0000, 0x03a2, 0x8161, 0x03a3, 0x0000, // 0024 + 0x03ac, 0x0001, 0x03cf, 0x8194, 0x03ef, 0x0001, 0x03f4, 0x001d, // 0028 + 0x0400, 0x0000, 0x0430, 0x0001, 0x0460, 0x81b4, 0x04fa, 0x001d, // 002c + 0x0531, 0x0000, 0x0557, 0x8180, 0x055a, 0x0018, 0x0560, 0x8161, // 0030 + 0x0561, 0x0001, 0x0588, 0x824e, 0x058b, 0x001d, 0x0591, 0x0005, // 0034 + 0x05a2, 0x8161, 0x05a3, 0x0005, 0x05ba, 0x8251, 0x05c5, 0x001d, // 0038 + 0x05d0, 0x0004, 0x05eb, 0x001d, 0x05f0, 0x825c, 0x05f5, 0x001d, // 003c + 0x060c, 0x8001, 0x060d, 0x001d, 0x061b, 0x8261, 0x0621, 0x0004, // 0040 + 0x063b, 0x001d, 0x0640, 0x8177, 0x0641, 0x0004, 0x064b, 0x0005, // 0044 + 0x0656, 0x001d, 0x0660, 0x0008, 0x066a, 0x8267, 0x0671, 0x0004, // 0048 + 0x06d4, 0x826e, 0x06d6, 0x0005, 0x06dd, 0x81dc, 0x06df, 0x0005, // 004c + 0x06e5, 0x8270, 0x06f0, 0x0008, 0x06fa, 0x827b, 0x0700, 0x0018, // 0050 + 0x070e, 0x8281, 0x0712, 0x0004, 0x072d, 0x817e, 0x0730, 0x0005, // 0054 + 0x074b, 0x001d, 0x0780, 0x0004, 0x07a6, 0x0005, 0x07b1, 0x001d, // 0058 + 0x0901, 0x8285, 0x0905, 0x0004, 0x093a, 0x8289, 0x0941, 0x0005, // 005c + 0x0949, 0x8290, 0x0958, 0x0004, 0x0962, 0x829f, 0x0966, 0x0008, // 0060 + 0x0970, 0x8001, 0x0971, 0x001d, 0x0981, 0x82a3, 0x0985, 0x0004, // 0064 + 0x098d, 0x82a7, 0x0993, 0x0004, 0x09a9, 0x8161, 0x09aa, 0x0004, // 0068 + 0x09b1, 0x82ad, 0x09ce, 0x001d, 0x09d7, 0x82ca, 0x09e6, 0x0008, // 006c + 0x09f0, 0x82d9, 0x09f4, 0x000a, 0x09fa, 0x8027, 0x09fb, 0x001d, // 0070 + 0x0a02, 0x8278, 0x0a05, 0x0004, 0x0a0b, 0x82dd, 0x0a13, 0x0004, // 0074 + 0x0a29, 0x8161, 0x0a2a, 0x0004, 0x0a31, 0x82e5, 0x0a4e, 0x001d, // 0078 + 0x0a59, 0x8302, 0x0a5f, 0x001d, 0x0a66, 0x0008, 0x0a70, 0x8300, // 007c + 0x0a75, 0x001d, 0x0a81, 0x8285, 0x0a85, 0x0004, 0x0a8c, 0x8308, // 0080 + 0x0a93, 0x0004, 0x0aa9, 0x8161, 0x0aaa, 0x0004, 0x0ab1, 0x82a8, // 0084 + 0x0ab5, 0x0004, 0x0aba, 0x8289, 0x0ac1, 0x0005, 0x0ac6, 0x830f, // 0088 + 0x0ad1, 0x001d, 0x0ae0, 0x80fc, 0x0ae1, 0x001d, 0x0ae6, 0x0008, // 008c + 0x0af0, 0x001d, 0x0b01, 0x82a3, 0x0b05, 0x0004, 0x0b0d, 0x82a7, // 0090 + 0x0b13, 0x0004, 0x0b29, 0x8161, 0x0b2a, 0x0004, 0x0b31, 0x831a, // 0094 + 0x0b4e, 0x001d, 0x0b56, 0x8337, 0x0b66, 0x0008, 0x0b70, 0x8027, // 0098 + 0x0b71, 0x001d, 0x0b82, 0x8286, 0x0b85, 0x0004, 0x0b8b, 0x8347, // 009c + 0x0bae, 0x0004, 0x0bb6, 0x836a, 0x0bce, 0x001d, 0x0bd7, 0x8287, // 00a0 + 0x0bd8, 0x001d, 0x0be7, 0x0008, 0x0bf0, 0x803d, 0x0bf3, 0x001d, // 00a4 + 0x0c01, 0x837a, 0x0c05, 0x0004, 0x0c0d, 0x830a, 0x0c12, 0x0004, // 00a8 + 0x0c29, 0x8161, 0x0c2a, 0x0004, 0x0c34, 0x8161, 0x0c35, 0x0004, // 00ac + 0x0c3a, 0x8382, 0x0c4e, 0x001d, 0x0c55, 0x8179, 0x0c57, 0x001d, // 00b0 + 0x0c60, 0x8341, 0x0c66, 0x0008, 0x0c70, 0x001d, 0x0c82, 0x82a4, // 00b4 + 0x0c85, 0x0004, 0x0c8d, 0x830a, 0x0c92, 0x0004, 0x0ca9, 0x8161, // 00b8 + 0x0caa, 0x0004, 0x0cb4, 0x8161, 0x0cb5, 0x0004, 0x0cba, 0x8396, // 00bc + 0x0cc0, 0x0006, 0x0cc5, 0x839c, 0x0cce, 0x001d, 0x0cd5, 0x828d, // 00c0 + 0x0cd7, 0x001d, 0x0cde, 0x83a5, 0x0ce6, 0x0008, 0x0cf0, 0x001d, // 00c4 + 0x0d02, 0x82a4, 0x0d05, 0x0004, 0x0d0d, 0x830a, 0x0d12, 0x0004, // 00c8 + 0x0d29, 0x8161, 0x0d2a, 0x0004, 0x0d3a, 0x83ad, 0x0d4e, 0x001d, // 00cc + 0x0d57, 0x8287, 0x0d58, 0x001d, 0x0d60, 0x8341, 0x0d66, 0x0008, // 00d0 + 0x0d70, 0x001d, 0x0d82, 0x82a4, 0x0d85, 0x0004, 0x0d97, 0x817e, // 00d4 + 0x0d9a, 0x0004, 0x0db2, 0x8161, 0x0db3, 0x0004, 0x0dbc, 0x82ad, // 00d8 + 0x0dc0, 0x0004, 0x0dc7, 0x83c1, 0x0dd8, 0x0006, 0x0de0, 0x001d, // 00dc + 0x0df2, 0x83d2, 0x0df5, 0x001d, 0x0e01, 0x0004, 0x0e31, 0x825b, // 00e0 + 0x0e34, 0x0005, 0x0e3b, 0x83d5, 0x0e40, 0x0004, 0x0e46, 0x8177, // 00e4 + 0x0e47, 0x0005, 0x0e4f, 0x8001, 0x0e50, 0x0008, 0x0e5a, 0x8001, // 00e8 + 0x0e5c, 0x001d, 0x0e81, 0x83da, 0x0e8e, 0x001d, 0x0e94, 0x82b2, // 00ec + 0x0e99, 0x0004, 0x0ea0, 0x83e7, 0x0eb4, 0x0005, 0x0eba, 0x83fb, // 00f0 + 0x0ec0, 0x0004, 0x0ec5, 0x8181, 0x0ec8, 0x0005, 0x0ece, 0x8161, // 00f4 + 0x0ed0, 0x0008, 0x0eda, 0x8279, 0x0ede, 0x001d, 0x0f00, 0x8401, // 00f8 + 0x0f04, 0x0018, 0x0f13, 0x001c, 0x0f18, 0x8179, 0x0f1a, 0x001c, // 00fc + 0x0f20, 0x0008, 0x0f2a, 0x000a, 0x0f34, 0x8405, 0x0f40, 0x0004, // 0100 + 0x0f48, 0x8161, 0x0f49, 0x0004, 0x0f6b, 0x001d, 0x0f71, 0x0005, // 0104 + 0x0f7f, 0x8287, 0x0f80, 0x0005, 0x0f85, 0x8411, 0x0f90, 0x0005, // 0108 + 0x0f98, 0x8161, 0x0f99, 0x0005, 0x0fbd, 0x8161, 0x0fbe, 0x001c, // 010c + 0x0fc6, 0x8179, 0x0fc7, 0x001c, 0x0fcd, 0x841c, 0x0fd0, 0x001d, // 0110 + 0x1000, 0x0004, 0x1022, 0x8161, 0x1023, 0x0004, 0x1028, 0x841f, // 0114 + 0x103a, 0x001d, 0x1040, 0x0008, 0x104a, 0x0018, 0x1050, 0x0004, // 0118 + 0x1056, 0x82bb, 0x105a, 0x001d, 0x10a0, 0x0000, 0x10c6, 0x001d, // 011c + 0x10d0, 0x0004, 0x10f7, 0x8431, 0x1100, 0x0004, 0x115a, 0x001d, // 0120 + 0x115f, 0x0004, 0x11a3, 0x001d, 0x11a8, 0x0004, 0x11fa, 0x001d, // 0124 + 0x1200, 0x0004, 0x1207, 0x8161, 0x1208, 0x0004, 0x1247, 0x843a, // 0128 + 0x1250, 0x0004, 0x1257, 0x8443, 0x1260, 0x0004, 0x1287, 0x843a, // 012c + 0x1290, 0x0004, 0x12af, 0x843a, 0x12b8, 0x0004, 0x12bf, 0x843a, // 0130 + 0x12c8, 0x0004, 0x12cf, 0x8161, 0x12d0, 0x0004, 0x12d7, 0x8161, // 0134 + 0x12d8, 0x0004, 0x12ef, 0x8161, 0x12f0, 0x0004, 0x130f, 0x843a, // 0138 + 0x1318, 0x0004, 0x131f, 0x8161, 0x1320, 0x0004, 0x1347, 0x8161, // 013c + 0x1348, 0x0004, 0x135b, 0x001d, 0x1361, 0x0018, 0x1369, 0x0008, // 0140 + 0x1372, 0x000a, 0x137d, 0x001d, 0x13a0, 0x0004, 0x13f5, 0x001d, // 0144 + 0x1401, 0x0004, 0x166d, 0x8001, 0x166f, 0x0004, 0x1677, 0x001d, // 0148 + 0x1680, 0x8000, 0x1681, 0x0004, 0x169b, 0x844c, 0x16a0, 0x0004, // 014c + 0x16eb, 0x8451, 0x16f1, 0x001d, 0x1780, 0x0004, 0x17b4, 0x828d, // 0150 + 0x17b7, 0x0005, 0x17be, 0x0006, 0x17c6, 0x82a3, 0x17c9, 0x0005, // 0154 + 0x17d4, 0x0018, 0x17db, 0x8457, 0x17e0, 0x0008, 0x17ea, 0x001d, // 0158 + 0x1800, 0x0018, 0x1806, 0x845c, 0x1810, 0x0008, 0x181a, 0x001d, // 015c + 0x1820, 0x0004, 0x1843, 0x8177, 0x1844, 0x0004, 0x1878, 0x001d, // 0160 + 0x1880, 0x0004, 0x18a9, 0x8179, 0x18aa, 0x001d, 0x1e00, 0x8466, // 0164 + 0x1e95, 0x0001, 0x1e9c, 0x84fb, 0x1efa, 0x001d, 0x1f00, 0x0001, // 0168 + 0x1f08, 0x0000, 0x1f10, 0x0001, 0x1f16, 0x8161, 0x1f18, 0x0000, // 016c + 0x1f1e, 0x8161, 0x1f20, 0x0001, 0x1f28, 0x0000, 0x1f30, 0x0001, // 0170 + 0x1f38, 0x0000, 0x1f40, 0x0001, 0x1f46, 0x8161, 0x1f48, 0x0000, // 0174 + 0x1f4e, 0x8161, 0x1f50, 0x0001, 0x1f58, 0x8559, 0x1f60, 0x0001, // 0178 + 0x1f68, 0x0000, 0x1f70, 0x0001, 0x1f7e, 0x8161, 0x1f80, 0x0001, // 017c + 0x1f88, 0x0002, 0x1f90, 0x0001, 0x1f98, 0x0002, 0x1fa0, 0x0001, // 0180 + 0x1fa8, 0x0002, 0x1fb0, 0x0001, 0x1fb5, 0x8561, 0x1fe0, 0x0001, // 0184 + 0x1fe8, 0x0000, 0x1fed, 0x858c, 0x2000, 0x000b, 0x200c, 0x8461, // 0188 + 0x2010, 0x0013, 0x2016, 0x859f, 0x2020, 0x0018, 0x2028, 0x85a9, // 018c + 0x202a, 0x000f, 0x202f, 0x8000, 0x2030, 0x0018, 0x2039, 0x85ab, // 0190 + 0x2048, 0x0018, 0x204e, 0x001d, 0x206a, 0x000f, 0x2070, 0x85ba, // 0194 + 0x2074, 0x000a, 0x207a, 0x85be, 0x2080, 0x000a, 0x208a, 0x85be, // 0198 + 0x208f, 0x001d, 0x20a0, 0x001a, 0x20b0, 0x001d, 0x20d0, 0x0005, // 019c + 0x20dd, 0x85c4, 0x20e4, 0x001d, 0x2100, 0x85cb, 0x2119, 0x0000, // 01a0 + 0x211e, 0x001c, 0x2124, 0x85e4, 0x213b, 0x001d, 0x2153, 0x000a, // 01a4 + 0x2160, 0x0009, 0x2184, 0x001d, 0x2190, 0x0019, 0x2195, 0x001c, // 01a8 + 0x219a, 0x85fb, 0x21a7, 0x001c, 0x21ae, 0x800b, 0x21af, 0x001c, // 01ac + 0x21ce, 0x8608, 0x21d5, 0x001c, 0x21f4, 0x001d, 0x2200, 0x0019, // 01b0 + 0x22f2, 0x001d, 0x2300, 0x001c, 0x2308, 0x860f, 0x230c, 0x001c, // 01b4 + 0x2320, 0x8012, 0x2322, 0x001c, 0x2329, 0x8008, 0x232b, 0x001c, // 01b8 + 0x237c, 0x8161, 0x237d, 0x001c, 0x239b, 0x001d, 0x2400, 0x001c, // 01bc + 0x2427, 0x001d, 0x2440, 0x001c, 0x244b, 0x001d, 0x2460, 0x000a, // 01c0 + 0x249c, 0x001c, 0x24ea, 0x8033, 0x24eb, 0x001d, 0x2500, 0x001c, // 01c4 + 0x2596, 0x001d, 0x25a0, 0x001c, 0x25b7, 0x800b, 0x25b8, 0x001c, // 01c8 + 0x25c1, 0x800b, 0x25c2, 0x001c, 0x25f8, 0x001d, 0x2600, 0x001c, // 01cc + 0x2614, 0x001d, 0x2619, 0x001c, 0x266f, 0x85fc, 0x2672, 0x001d, // 01d0 + 0x2701, 0x8613, 0x270c, 0x001c, 0x2728, 0x8161, 0x2729, 0x001c, // 01d4 + 0x274c, 0x861e, 0x2758, 0x001c, 0x275f, 0x8161, 0x2761, 0x001c, // 01d8 + 0x2768, 0x001d, 0x2776, 0x000a, 0x2794, 0x861b, 0x2798, 0x001c, // 01dc + 0x27b0, 0x8161, 0x27b1, 0x001c, 0x27bf, 0x001d, 0x2800, 0x001c, // 01e0 + 0x2900, 0x001d, 0x2e80, 0x001c, 0x2e9a, 0x8161, 0x2e9b, 0x001c, // 01e4 + 0x2ef4, 0x001d, 0x2f00, 0x001c, 0x2fd6, 0x001d, 0x2ff0, 0x001c, // 01e8 + 0x2ffc, 0x862a, 0x3021, 0x0009, 0x302a, 0x0005, 0x3030, 0x800d, // 01ec + 0x3031, 0x0003, 0x3036, 0x864f, 0x3041, 0x0004, 0x3095, 0x865a, // 01f0 + 0x30a1, 0x0004, 0x30fb, 0x8666, 0x30ff, 0x001d, 0x3105, 0x0004, // 01f4 + 0x312d, 0x817e, 0x3131, 0x0004, 0x318f, 0x866a, 0x3196, 0x001c, // 01f8 + 0x31a0, 0x0004, 0x31b8, 0x001d, 0x3200, 0x001c, 0x321d, 0x817e, // 01fc + 0x3220, 0x000a, 0x322a, 0x001c, 0x3244, 0x001d, 0x3260, 0x001c, // 0200 + 0x327c, 0x841b, 0x3280, 0x000a, 0x328a, 0x001c, 0x32b1, 0x001d, // 0204 + 0x32c0, 0x001c, 0x32cc, 0x817e, 0x32d0, 0x001c, 0x32ff, 0x8161, // 0208 + 0x3300, 0x001c, 0x3377, 0x817e, 0x337b, 0x001c, 0x33de, 0x8161, // 020c + 0x33e0, 0x001c, 0x33ff, 0x8161, 0x3400, 0x0004, 0x4db6, 0x001d, // 0210 + 0x4e00, 0x0004, 0x9fa6, 0x001d, 0xa000, 0x0004, 0xa48d, 0x817e, // 0214 + 0xa490, 0x001c, 0xa4a2, 0x8161, 0xa4a4, 0x001c, 0xa4b4, 0x8161, // 0218 + 0xa4b5, 0x001c, 0xa4c1, 0x8671, 0xa4c7, 0x001d, 0xac00, 0x0004, // 021c + 0xd7a4, 0x001d, 0xd800, 0x0010, 0xe000, 0x0011, 0xf900, 0x0004, // 0220 + 0xfa2e, 0x001d, 0xfb00, 0x0001, 0xfb07, 0x001d, 0xfb13, 0x0001, // 0224 + 0xfb18, 0x001d, 0xfb1d, 0x8283, 0xfb1f, 0x0004, 0xfb29, 0x800b, // 0228 + 0xfb2a, 0x0004, 0xfb37, 0x8161, 0xfb38, 0x0004, 0xfb3d, 0x8677, // 022c + 0xfb46, 0x0004, 0xfbb2, 0x001d, 0xfbd3, 0x0004, 0xfd3e, 0x8008, // 0230 + 0xfd40, 0x001d, 0xfd50, 0x0004, 0xfd90, 0x8161, 0xfd92, 0x0004, // 0234 + 0xfdc8, 0x001d, 0xfdf0, 0x0004, 0xfdfc, 0x001d, 0xfe20, 0x81d7, // 0238 + 0xfe24, 0x001d, 0xfe30, 0x8680, 0xfe76, 0x0004, 0xfefd, 0x86c6, // 023c + 0xff10, 0x0008, 0xff1a, 0x8010, 0xff21, 0x0000, 0xff3b, 0x8017, // 0240 + 0xff41, 0x0001, 0xff5b, 0x86d9, 0xff66, 0x0004, 0xff70, 0x8177, // 0244 + 0xff71, 0x0004, 0xff9e, 0x8177, 0xffa0, 0x0004, 0xffbf, 0x817e, // 0248 + 0xffc2, 0x0004, 0xffc8, 0x8161, 0xffca, 0x0004, 0xffd0, 0x8161, // 024c + 0xffd2, 0x0004, 0xffd8, 0x86e4, 0xffef, 0x001d, 0xfff9, 0x86fb, // 0250 + 0xffff, 0x0000 +}; + +static unsigned char UC_Runs[] = { + 0x0b, 0x18, 0x18, 0x18, 0x1a, 0x18, 0x18, 0x18, 0x14, 0x15, 0x18, 0x19, 0x18, 0x13, 0x18, 0x18, // 0000 + 0x18, 0x18, 0x19, 0x19, 0x19, 0x18, 0x18, 0x14, 0x18, 0x15, 0x1b, 0x12, 0x1b, 0x14, 0x19, 0x15, // 0010 + 0x19, 0x0b, 0x18, 0x1a, 0x1a, 0x1a, 0x1a, 0x1c, 0x1c, 0x1b, 0x1c, 0x01, 0x16, 0x19, 0x13, 0x1c, // 0020 + 0x1b, 0x1c, 0x19, 0x0a, 0x0a, 0x1b, 0x01, 0x1c, 0x18, 0x1b, 0x0a, 0x01, 0x17, 0x0a, 0x0a, 0x0a, // 0030 + 0x18, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 0040 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 0050 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 0060 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 0070 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 0080 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 0090 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 00a0 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 00b0 + 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, // 00c0 + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, // 00d0 + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, // 00e0 + 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x04, 0x00, 0x01, 0x01, // 00f0 + 0x01, 0x04, 0x04, 0x04, 0x04, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x02, 0x01, 0x00, 0x01, // 0100 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, // 0110 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 0120 + 0x01, 0x01, 0x00, 0x02, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 0130 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 0140 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 0150 + 0x01, 0x1d, 0x1d, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 0160 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x1b, 0x1b, 0x03, 0x03, 0x05, 0x05, 0x05, 0x1b, 0x1b, 0x1d, 0x1d, // 0170 + 0x1d, 0x1d, 0x03, 0x1d, 0x1d, 0x1d, 0x18, 0x1b, 0x1b, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1d, 0x00, // 0180 + 0x1d, 0x00, 0x00, 0x01, 0x1d, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x1d, 0x1d, 0x00, // 0190 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 01a0 + 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 01b0 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 01c0 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x1c, 0x05, 0x05, 0x05, 0x05, 0x1d, 0x07, 0x07, 0x1d, 0x1d, // 01d0 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 01e0 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 01f0 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 0200 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x1d, 0x1d, 0x00, 0x01, 0x1d, 0x1d, 0x00, // 0210 + 0x01, 0x1d, 0x1d, 0x1d, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 0220 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 0230 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x1d, 0x1d, 0x00, 0x01, 0x1d, 0x18, // 0240 + 0x13, 0x1d, 0x05, 0x05, 0x05, 0x18, 0x05, 0x18, 0x05, 0x05, 0x18, 0x05, 0x04, 0x04, 0x04, 0x18, // 0250 + 0x18, 0x18, 0x1d, 0x1d, 0x1d, 0x18, 0x1d, 0x18, 0x18, 0x18, 0x18, 0x1d, 0x1d, 0x05, 0x18, 0x04, // 0260 + 0x03, 0x03, 0x05, 0x05, 0x1c, 0x05, 0x05, 0x05, 0x05, 0x1d, 0x1d, 0x04, 0x04, 0x04, 0x1c, 0x1c, // 0270 + 0x1d, 0x1d, 0x0f, 0x04, 0x05, 0x05, 0x05, 0x06, 0x1d, 0x1d, 0x1d, 0x05, 0x04, 0x06, 0x06, 0x06, // 0280 + 0x06, 0x06, 0x06, 0x06, 0x05, 0x1d, 0x1d, 0x04, 0x05, 0x05, 0x05, 0x05, 0x1d, 0x1d, 0x1d, 0x05, // 0290 + 0x05, 0x18, 0x18, 0x05, 0x06, 0x06, 0x1d, 0x1d, 0x1d, 0x04, 0x04, 0x1d, 0x1d, 0x1d, 0x04, 0x1d, // 02a0 + 0x1d, 0x1d, 0x04, 0x04, 0x04, 0x04, 0x1d, 0x1d, 0x05, 0x1d, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, // 02b0 + 0x05, 0x1d, 0x1d, 0x06, 0x06, 0x1d, 0x1d, 0x06, 0x06, 0x05, 0x06, 0x1d, 0x1d, 0x1d, 0x1d, 0x04, // 02c0 + 0x04, 0x1d, 0x04, 0x04, 0x04, 0x05, 0x05, 0x1d, 0x1d, 0x04, 0x04, 0x1a, 0x1a, 0x1d, 0x1d, 0x1d, // 02d0 + 0x1d, 0x04, 0x04, 0x1d, 0x1d, 0x1d, 0x04, 0x04, 0x1d, 0x04, 0x04, 0x1d, 0x04, 0x04, 0x1d, 0x1d, // 02e0 + 0x05, 0x1d, 0x06, 0x06, 0x06, 0x05, 0x05, 0x1d, 0x1d, 0x1d, 0x1d, 0x05, 0x05, 0x1d, 0x1d, 0x05, // 02f0 + 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x1d, 0x04, 0x1d, 0x04, 0x1d, 0x04, 0x04, 0x04, 0x1d, 0x1d, // 0300 + 0x05, 0x05, 0x06, 0x1d, 0x06, 0x06, 0x05, 0x1d, 0x1d, 0x04, 0x1d, 0x04, 0x04, 0x1d, 0x1d, 0x04, // 0310 + 0x04, 0x04, 0x04, 0x1d, 0x1d, 0x05, 0x04, 0x06, 0x05, 0x06, 0x05, 0x05, 0x05, 0x1d, 0x1d, 0x1d, // 0320 + 0x06, 0x06, 0x1d, 0x1d, 0x06, 0x06, 0x05, 0x05, 0x06, 0x1d, 0x1d, 0x1d, 0x1d, 0x04, 0x04, 0x1d, // 0330 + 0x04, 0x04, 0x04, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x04, 0x04, 0x04, 0x1d, 0x04, 0x04, // 0340 + 0x04, 0x04, 0x1d, 0x1d, 0x1d, 0x04, 0x04, 0x1d, 0x04, 0x1d, 0x04, 0x04, 0x1d, 0x1d, 0x1d, 0x04, // 0350 + 0x04, 0x1d, 0x1d, 0x1d, 0x04, 0x04, 0x04, 0x1d, 0x1d, 0x1d, 0x1d, 0x04, 0x04, 0x04, 0x1d, 0x1d, // 0360 + 0x1d, 0x1d, 0x06, 0x06, 0x05, 0x06, 0x06, 0x1d, 0x1d, 0x1d, 0x06, 0x06, 0x06, 0x1d, 0x06, 0x06, // 0370 + 0x06, 0x05, 0x1d, 0x1d, 0x1d, 0x1d, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x1d, 0x05, 0x05, // 0380 + 0x05, 0x1d, 0x05, 0x05, 0x05, 0x05, 0x1d, 0x1d, 0x1d, 0x1d, 0x06, 0x05, 0x1d, 0x05, 0x06, 0x06, // 0390 + 0x1d, 0x06, 0x06, 0x05, 0x05, 0x04, 0x1d, 0x04, 0x04, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, // 03a0 + 0x1d, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x1d, 0x1d, 0x06, 0x06, 0x06, 0x1d, 0x06, 0x06, 0x06, // 03b0 + 0x05, 0x1d, 0x1d, 0x1d, 0x05, 0x1d, 0x1d, 0x1d, 0x1d, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x1d, // 03c0 + 0x05, 0x1d, 0x06, 0x06, 0x18, 0x1d, 0x1d, 0x1d, 0x1d, 0x1a, 0x04, 0x04, 0x1d, 0x04, 0x1d, 0x1d, // 03d0 + 0x04, 0x04, 0x1d, 0x04, 0x1d, 0x1d, 0x04, 0x1d, 0x04, 0x04, 0x04, 0x1d, 0x04, 0x1d, 0x04, 0x1d, // 03e0 + 0x1d, 0x04, 0x04, 0x1d, 0x04, 0x04, 0x04, 0x04, 0x05, 0x04, 0x04, 0x1d, 0x05, 0x05, 0x04, 0x1d, // 03f0 + 0x1d, 0x04, 0x1c, 0x1c, 0x1c, 0x1c, 0x05, 0x1c, 0x05, 0x1c, 0x05, 0x14, 0x15, 0x14, 0x15, 0x06, // 0400 + 0x06, 0x18, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1c, 0x1d, // 0410 + 0x04, 0x04, 0x1d, 0x06, 0x05, 0x05, 0x05, 0x05, 0x06, 0x05, 0x1d, 0x1d, 0x1d, 0x05, 0x05, 0x06, // 0420 + 0x05, 0x1d, 0x1d, 0x1d, 0x1d, 0x18, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x04, 0x1d, 0x04, 0x04, 0x04, // 0430 + 0x04, 0x1d, 0x1d, 0x1d, 0x04, 0x1d, 0x04, 0x04, 0x04, 0x04, 0x1d, 0x1d, 0x14, 0x15, 0x1d, 0x1d, // 0440 + 0x1d, 0x18, 0x18, 0x18, 0x0a, 0x0a, 0x0a, 0x1a, 0x18, 0x1d, 0x1d, 0x1d, 0x13, 0x18, 0x18, 0x18, // 0450 + 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x1d, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 0460 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 0470 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 0480 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 0490 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 04a0 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 04b0 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 04c0 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 04d0 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 04e0 + 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1d, 0x1d, 0x1d, 0x1d, 0x00, // 04f0 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 0500 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 0510 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 0520 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 0530 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, // 0540 + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x1d, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x1d, // 0550 + 0x00, 0x1d, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1b, 0x01, 0x1b, 0x1b, 0x1b, 0x01, 0x01, // 0560 + 0x01, 0x1d, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1b, 0x1b, 0x1b, 0x01, 0x01, 0x01, 0x01, // 0570 + 0x1d, 0x1d, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1d, // 0580 + 0x1d, 0x01, 0x01, 0x01, 0x1d, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1b, 0x1b, 0x1d, 0x18, // 0590 + 0x18, 0x16, 0x17, 0x14, 0x16, 0x16, 0x17, 0x14, 0x16, 0x0c, 0x0d, 0x16, 0x17, 0x18, 0x18, 0x18, // 05a0 + 0x18, 0x12, 0x12, 0x18, 0x18, 0x18, 0x19, 0x14, 0x15, 0x1d, 0x0a, 0x1d, 0x1d, 0x1d, 0x19, 0x19, // 05b0 + 0x19, 0x14, 0x15, 0x01, 0x07, 0x07, 0x07, 0x07, 0x05, 0x07, 0x07, 0x1c, 0x1c, 0x00, 0x1c, 0x1c, // 05c0 + 0x1c, 0x1c, 0x00, 0x1c, 0x1c, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x1c, // 05d0 + 0x00, 0x1c, 0x1c, 0x1c, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x01, // 05e0 + 0x00, 0x00, 0x1c, 0x00, 0x01, 0x04, 0x04, 0x04, 0x04, 0x01, 0x1c, 0x19, 0x19, 0x1c, 0x1c, 0x1c, // 05f0 + 0x1c, 0x19, 0x1c, 0x1c, 0x19, 0x1c, 0x1c, 0x19, 0x19, 0x19, 0x1c, 0x1c, 0x19, 0x1c, 0x19, 0x19, // 0600 + 0x19, 0x19, 0x19, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1c, // 0610 + 0x1d, 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x0b, 0x18, // 0620 + 0x18, 0x18, 0x1c, 0x03, 0x04, 0x09, 0x14, 0x15, 0x14, 0x15, 0x14, 0x15, 0x14, 0x15, 0x14, 0x15, // 0630 + 0x1c, 0x1c, 0x14, 0x15, 0x14, 0x15, 0x14, 0x15, 0x14, 0x15, 0x13, 0x14, 0x15, 0x15, 0x1c, 0x1c, // 0640 + 0x1c, 0x09, 0x09, 0x09, 0x1d, 0x1d, 0x1d, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x05, 0x05, // 0650 + 0x1b, 0x1b, 0x03, 0x03, 0x1d, 0x1d, 0x12, 0x03, 0x03, 0x03, 0x1d, 0x1c, 0x1c, 0x0a, 0x0a, 0x0a, // 0660 + 0x0a, 0x1d, 0x1c, 0x1c, 0x1c, 0x1d, 0x1c, 0x1d, 0x04, 0x1d, 0x04, 0x04, 0x1d, 0x04, 0x04, 0x1d, // 0670 + 0x18, 0x13, 0x13, 0x12, 0x12, 0x14, 0x15, 0x14, 0x15, 0x14, 0x15, 0x14, 0x15, 0x14, 0x15, 0x14, // 0680 + 0x15, 0x14, 0x15, 0x14, 0x15, 0x1d, 0x1d, 0x1d, 0x1d, 0x18, 0x18, 0x18, 0x18, 0x12, 0x12, 0x12, // 0690 + 0x18, 0x18, 0x18, 0x1d, 0x18, 0x18, 0x18, 0x18, 0x13, 0x14, 0x15, 0x14, 0x15, 0x14, 0x15, 0x18, // 06a0 + 0x18, 0x18, 0x19, 0x13, 0x19, 0x19, 0x19, 0x1d, 0x18, 0x1a, 0x18, 0x18, 0x1d, 0x1d, 0x1d, 0x1d, // 06b0 + 0x04, 0x04, 0x04, 0x1d, 0x04, 0x1d, 0x1d, 0x1d, 0x0f, 0x1d, 0x18, 0x18, 0x18, 0x1a, 0x18, 0x18, // 06c0 + 0x18, 0x14, 0x15, 0x18, 0x19, 0x18, 0x13, 0x18, 0x18, 0x14, 0x19, 0x15, 0x19, 0x1d, 0x1d, 0x18, // 06d0 + 0x14, 0x15, 0x18, 0x12, 0x1d, 0x1d, 0x04, 0x04, 0x04, 0x1d, 0x1d, 0x1d, 0x1a, 0x1a, 0x19, 0x1b, // 06e0 + 0x1c, 0x1a, 0x1a, 0x1d, 0x1c, 0x19, 0x19, 0x19, 0x19, 0x1c, 0x1c, 0x0f, 0x0f, 0x0f, 0x1c, 0x1c, // 06f0 + 0x1d, 0x1d +}; diff --git a/dna/System.Char.c b/dna/System.Char.c new file mode 100644 index 0000000..87e9884 --- /dev/null +++ b/dna/System.Char.c @@ -0,0 +1,120 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Char.h" + +#include "MetaData.h" +#include "Types.h" +#include "Type.h" + +#include "System.Char.UC_IndexRuns.h" +#include "System.Char.CaseConversion.h" + +#define UC_INDEX_LEN (sizeof(UC_Index) / 4) +tAsyncCall* System_Char_GetUnicodeCategory(PTR pThis_, PTR pParams, PTR pReturnValue) { + U32 paramCodePoint = ((U32*)pParams)[0]; + // Do a binary search on the UC_Index array + U32 curOfs = UC_INDEX_LEN / 2; + U32 upper = UC_INDEX_LEN; + U32 lower = 0; + U32 indexCodePoint; + if (paramCodePoint == 0xffff) { + // Special case for 0xffff, as this will not be handled correctly by the code below + *(U32*)pReturnValue = 29; + return NULL; + } + for(;;) { + indexCodePoint = UC_Index[curOfs << 1]; + if (paramCodePoint >= indexCodePoint && paramCodePoint < UC_Index[(curOfs+1) << 1]) { + // Found the correct entry... + U32 value = UC_Index[(curOfs << 1) + 1]; + if (value & 0x8000) { + // This is a run, not a direct look-up + value &= 0x7fff; + value += paramCodePoint - indexCodePoint; + value = UC_Runs[value]; + } + *(U32*)pReturnValue = value; + return NULL; + } + if (paramCodePoint < indexCodePoint) { + upper = curOfs; + } else { + lower = curOfs; + } + curOfs = lower + ((upper - lower) >> 1); + } +} + +// Return -1 if not found +static I32 SearchCaseArray(unsigned short *pCaseArray, unsigned short find) { + U32 lower = 0; + U32 upper = sizeof(UC_CaseUpper) / 2; + U32 curOfs = sizeof(UC_CaseUpper) / 4; + unsigned short val; + + if (find == 0xffff) { + // Hande 0xffff specially, as the search below cannot handle it. + return -1; + } + + for(;;) { + val = pCaseArray[curOfs]; + if (find >= val && find < pCaseArray[curOfs + 1]) { + // Found the correct entry + if (find == val) { + return (I32)curOfs; + } + return -1; + } + if (find < val) { + upper = curOfs; + } else { + lower = curOfs; + } + if (upper == 0) { + return -1; + } + curOfs = lower + ((upper - lower) >> 1); + } +} + +tAsyncCall* System_Char_ToLowerInvariant(PTR pThis_, PTR pParams, PTR pReturnValue) { + U32 paramCodePoint = ((U32*)pParams)[0]; + I32 pos; + + pos = SearchCaseArray(UC_CaseUpper, (unsigned short)paramCodePoint); + *(U32*)pReturnValue = (pos < 0)?paramCodePoint:UC_CaseLower[pos]; + + return NULL; +} + +tAsyncCall* System_Char_ToUpperInvariant(PTR pThis_, PTR pParams, PTR pReturnValue) { + U32 paramCodePoint = ((U32*)pParams)[0]; + I32 pos; + + pos = SearchCaseArray(UC_CaseLower, (unsigned short)paramCodePoint); + *(U32*)pReturnValue = (pos < 0)?paramCodePoint:UC_CaseUpper[pos]; + + return NULL; +} diff --git a/dna/System.Char.h b/dna/System.Char.h new file mode 100644 index 0000000..10472e7 --- /dev/null +++ b/dna/System.Char.h @@ -0,0 +1,30 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_CHAR_H) +#define __SYSTEM_CHAR_H + +#include "Types.h" + +tAsyncCall* System_Char_GetUnicodeCategory(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Char_ToLowerInvariant(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Char_ToUpperInvariant(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif diff --git a/dna/System.Console.c b/dna/System.Console.c new file mode 100644 index 0000000..f6af633 --- /dev/null +++ b/dna/System.Console.c @@ -0,0 +1,121 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.String.h" + +#include "MetaData.h" +#include "Types.h" +#include "Type.h" + +tAsyncCall* System_Console_Write(PTR pThis_, PTR pParams, PTR pReturnValue) { + HEAP_PTR string; + STRING2 str; + U32 i, strLen; + + string = *(HEAP_PTR*)pParams; + if (string != NULL) { +#define SUB_LEN 128 + unsigned char str8[SUB_LEN+1]; + U32 start = 0; + str = SystemString_GetString(string, &strLen); + while (strLen > 0) { + U32 thisLen = (strLen > SUB_LEN)?SUB_LEN:strLen; + for (i=0; isleepTime = -1; + pAsync->checkFn = Internal_ReadKey_Check; + pAsync->state = NULL; + + return pAsync; +} + +tAsyncCall* System_Console_Internal_KeyAvailable(PTR pThis_, PTR pParams, PTR pReturnValue) { + U32 c, isKey; + + isKey = Internal_ReadKey_Check(NULL, NULL, (PTR)&c, NULL); + if (isKey) { + nextKeybC = c; + *(U32*)pReturnValue = 1; + } else { + *(U32*)pReturnValue = 0; + } + + return NULL; +} diff --git a/dna/System.Console.h b/dna/System.Console.h new file mode 100644 index 0000000..02628b8 --- /dev/null +++ b/dna/System.Console.h @@ -0,0 +1,30 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_CONSOLE_H) +#define __SYSTEM_CONSOLE_H + +#include "Types.h" + +tAsyncCall* System_Console_Write(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Console_Internal_ReadKey(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Console_Internal_KeyAvailable(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif diff --git a/dna/System.DateTime.c b/dna/System.DateTime.c new file mode 100644 index 0000000..555a381 --- /dev/null +++ b/dna/System.DateTime.c @@ -0,0 +1,59 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.DateTime.h" + +#ifndef WIN32 + +#include + +#endif + +#define TicksPerSecond 10000000L +#define TicksPerMicroSecond 10L +#define TicksAtUnixEpoch 621355968000000000L +#define TicksAtFileTimeEpoch 504911232000000000L + +tAsyncCall* System_DateTime_InternalUtcNow(PTR pThis_, PTR pParams, PTR pReturnValue) { + +#ifdef WIN32 + + FILETIME ft; + + GetSystemTimeAsFileTime(&ft); + + *(U64*)pReturnValue = ((U64)ft.dwHighDateTime) * 0x100000000L + ((U64)ft.dwLowDateTime) + TicksAtFileTimeEpoch; + +#else + + struct timeval tp; + + gettimeofday(&tp, NULL); + + *(U64*)pReturnValue = ((U64)tp.tv_sec) * TicksPerSecond + ((U64)tp.tv_usec) * TicksPerMicroSecond + + TicksAtUnixEpoch; + +#endif + + return NULL; +} diff --git a/dna/System.DateTime.h b/dna/System.DateTime.h new file mode 100644 index 0000000..3ee236e --- /dev/null +++ b/dna/System.DateTime.h @@ -0,0 +1,26 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_DATETIME_H) +#define __SYSTEM_DATETIME_H + +tAsyncCall* System_DateTime_InternalUtcNow(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif diff --git a/dna/System.Diagnostics.Debugger.c b/dna/System.Diagnostics.Debugger.c new file mode 100644 index 0000000..655cd36 --- /dev/null +++ b/dna/System.Diagnostics.Debugger.c @@ -0,0 +1,36 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Char.h" + +#include "MetaData.h" +#include "Types.h" +#include "Type.h" + +tAsyncCall* System_Diagnostics_Debugger_Break(PTR pThis_, PTR pParams, PTR pReturnValue) { + printf("BREAK\n"); +#if defined(WIN32) && defined(_DEBUG) + __debugbreak(); +#endif + return NULL; +} diff --git a/dna/System.Diagnostics.Debugger.h b/dna/System.Diagnostics.Debugger.h new file mode 100644 index 0000000..4e65fdf --- /dev/null +++ b/dna/System.Diagnostics.Debugger.h @@ -0,0 +1,28 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_DIAGNOSTICS_DEBUGGER_H) +#define __SYSTEM_DIAGNOSTICS_DEBUGGER_H + +#include "Types.h" + +tAsyncCall* System_Diagnostics_Debugger_Break(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif diff --git a/dna/System.Enum.c b/dna/System.Enum.c new file mode 100644 index 0000000..643a3b7 --- /dev/null +++ b/dna/System.Enum.c @@ -0,0 +1,68 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Enum.h" + +#include "MetaData.h" +#include "Types.h" +#include "Type.h" +#include "System.RuntimeType.h" +#include "System.Array.h" +#include "System.String.h" + +tAsyncCall* System_Enum_Internal_GetValue(PTR pThis_, PTR pParams, PTR pReturnValue) { + *(U32*)pReturnValue = *(U32*)pThis_; + + return NULL; +} + +tAsyncCall* System_Enum_Internal_GetInfo(PTR pThis_, PTR pParams, PTR pReturnValue) { + tMD_TypeDef *pEnumType = RuntimeType_DeRef((PTR)((tMD_TypeDef**)pParams)[0]); + U32 i, retIndex; + HEAP_PTR names, values; + + // An enum type always has just one non-literal field, with all other fields being the values. + names = SystemArray_NewVector(types[TYPE_SYSTEM_ARRAY_STRING], pEnumType->numFields - 1); + values = SystemArray_NewVector(types[TYPE_SYSTEM_ARRAY_INT32], pEnumType->numFields - 1); + + for (i=0, retIndex=0; inumFields; i++) { + tMD_FieldDef *pField = pEnumType->ppFields[i]; + HEAP_PTR name; + I32 value; + + if (!FIELD_ISLITERAL(pField)) { + continue; + } + + name = SystemString_FromCharPtrASCII(pField->name); + SystemArray_StoreElement(names, retIndex, (PTR)&name); + MetaData_GetConstant(pField->pMetaData, pField->tableIndex, (PTR)&value); + SystemArray_StoreElement(values, retIndex, (PTR)&value); + retIndex++; + } + + *(((HEAP_PTR**)pParams)[1]) = names; + *(((HEAP_PTR**)pParams)[2]) = values; + + return NULL; +} diff --git a/dna/System.Enum.h b/dna/System.Enum.h new file mode 100644 index 0000000..b3c8c67 --- /dev/null +++ b/dna/System.Enum.h @@ -0,0 +1,29 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_ENUM_H) +#define __SYSTEM_ENUM_H + +#include "Types.h" + +tAsyncCall* System_Enum_Internal_GetValue(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Enum_Internal_GetInfo(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif diff --git a/dna/System.Environment.c b/dna/System.Environment.c new file mode 100644 index 0000000..43a4009 --- /dev/null +++ b/dna/System.Environment.c @@ -0,0 +1,70 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Environment.h" + +#include "Type.h" +#include "System.String.h" +#include "Heap.h" + +#include + +tAsyncCall* System_Environment_get_TickCount(PTR pThis_, PTR pParams, PTR pReturnValue) { + I32 t; + + t = (I32)msTime(); + *(I32*)pReturnValue = t; + + return NULL; +} + +tAsyncCall* System_Environment_GetOSVersionString(PTR pThis_, PTR pParams, PTR pReturnValue) { + static HEAP_PTR versionString = NULL; + if (versionString == NULL) { + char ver[64]; +#ifdef WIN32 + OSVERSIONINFO osVer; + osVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&osVer); + sprintf(ver, "%d.%d.%d", osVer.dwMajorVersion, osVer.dwMinorVersion, osVer.dwBuildNumber); +#else + strcpy(ver, "0.0.0"); +#endif + versionString = SystemString_FromCharPtrASCII(ver); + Heap_MakeUndeletable(versionString); + } + *(HEAP_PTR*)pReturnValue = versionString; + return NULL; +} + +tAsyncCall* System_Environment_get_Platform(PTR pThis_, PTR pParams, PTR pReturnValue) { +#ifdef WIN32 + OSVERSIONINFO osVer; + osVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&osVer); + *(U32*)pReturnValue = (osVer.dwPlatformId == VER_PLATFORM_WIN32_NT)?2:1; // Win32NT:Win32Windows +#else + *(U32*)pReturnValue = 4; // UNIX +#endif + return NULL; +} diff --git a/dna/System.Environment.h b/dna/System.Environment.h new file mode 100644 index 0000000..f095e40 --- /dev/null +++ b/dna/System.Environment.h @@ -0,0 +1,31 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_ENVIRONMENT_H) +#define __SYSTEM_ENVIRONMENT_H + +#include "MetaData.h" +#include "Types.h" + +tAsyncCall* System_Environment_get_TickCount(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Environment_GetOSVersionString(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Environment_get_Platform(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif diff --git a/dna/System.GC.c b/dna/System.GC.c new file mode 100644 index 0000000..9746a16 --- /dev/null +++ b/dna/System.GC.c @@ -0,0 +1,53 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Array.h" + +#include "Types.h" +#include "MetaData.h" +#include "Heap.h" +#include "Type.h" + +tAsyncCall* System_GC_Collect(PTR pThis_, PTR pParams, PTR pReturnValue) { + Heap_GarbageCollect(); + return NULL; +} + +tAsyncCall* System_GC_Internal_CollectionCount(PTR pThis_, PTR pParams, PTR pReturnValue) { + *(U32*)pReturnValue = Heap_NumCollections(); + return NULL; +} + +tAsyncCall* System_GC_GetTotalMemory(PTR pThis_, PTR pParams, PTR pReturnValue) { + if (*(U32*)pParams) { + Heap_GarbageCollect(); + } + *(U64*)pReturnValue = Heap_GetTotalMemory(); + return NULL; +} + +tAsyncCall* System_GC_SuppressFinalize(PTR pThis_, PTR pParams, PTR pReturnValue) { + HEAP_PTR obj = ((HEAP_PTR*)pParams)[0]; + Heap_UnmarkFinalizer(obj); + return NULL; +} diff --git a/dna/System.GC.h b/dna/System.GC.h new file mode 100644 index 0000000..407dd8a --- /dev/null +++ b/dna/System.GC.h @@ -0,0 +1,32 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_GC_H) +#define __SYSTEM_GC_H + +#include "MetaData.h" +#include "Types.h" + +tAsyncCall* System_GC_Collect(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_GC_Internal_CollectionCount(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_GC_GetTotalMemory(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_GC_SuppressFinalize(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif \ No newline at end of file diff --git a/dna/System.IO.FileInternal.c b/dna/System.IO.FileInternal.c new file mode 100644 index 0000000..9379234 --- /dev/null +++ b/dna/System.IO.FileInternal.c @@ -0,0 +1,274 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Object.h" + +#include "Types.h" +#include "Type.h" +#include "Heap.h" +#include "System.String.h" +#include "System.Array.h" + +#include "errno.h" + +#define ERROR_UNKNOWNMODE -1 + +#define FILEMODE_CREATENEW 1 +#define FILEMODE_CREATE 2 +#define FILEMODE_OPEN 3 +#define FILEMODE_OPENORCREATE 4 +#define FILEMODE_TRUNCATE 5 +#define FILEMODE_APPEND 6 + +#define FILEATTRIBUTES_DIRECTORY 0x00010 + +tAsyncCall* System_IO_FileInternal_Open(PTR pThis_, PTR pParams, PTR pReturnValue) { + U32 filenameLen; + STRING2 filename2; + U32 mode, access, share; + U32 *pError; + unsigned char filename[256]; + U32 i; + I32 f = 0; + int flags, error = 0; + + filename2 = SystemString_GetString(((HEAP_PTR*)pParams)[0], &filenameLen); + mode = ((U32*)pParams)[1]; + access = ((U32*)pParams)[2]; + share = ((U32*)pParams)[3]; + pError = ((U32**)pParams)[4]; + + for (i=0; i= tempStoreSize) { + tempStoreSize <<= 1; + pTempStore = realloc(pTempStore, tempStoreSize * sizeof(void*)); + } + str = SystemString_FromCharPtrUTF16(find.cFileName); + // Need to temporarily make these undeletable, in case a GC happens before they're in the array + Heap_MakeUndeletable(str); + pTempStore[tempStoreOfs++] = str; + } + } while (FindNextFile(hFind, &find) != 0); + FindClose(hFind); + } +#else + unsigned char path8[256]; + glob_t gl; + for (i=0; i= tempStoreSize) { + tempStoreSize <<= 1; + pTempStore = realloc(pTempStore, tempStoreSize * sizeof(void*)); + } + str = SystemString_FromCharPtrASCII(pResult); + // Need to temporarily make these undeletable, in case a GC happens before they're in the array + Heap_MakeUndeletable(str); + pTempStore[tempStoreOfs++] = str; + } + } + globfree(&gl); + } else { + *pError = errno; + } +#endif + // Move the temp-store values into the final returnable array + retArray = SystemArray_NewVector(types[TYPE_SYSTEM_ARRAY_STRING], tempStoreOfs); + arrayElements = SystemArray_GetElements(retArray); + memcpy(arrayElements, pTempStore, tempStoreOfs * sizeof(void*)); + free(pTempStore); + *(HEAP_PTR*)pReturnValue = retArray; + // Make the strings deletable again + for (i=0; i + +tAsyncCall* System_Math_Sin(PTR pThis_, PTR pParams, PTR pReturnValue) { + *(double*)pReturnValue = sin(INTERNALCALL_PARAM(0, double)); + + return NULL; +} + +tAsyncCall* System_Math_Cos(PTR pThis_, PTR pParams, PTR pReturnValue) { + *(double*)pReturnValue = cos(INTERNALCALL_PARAM(0, double)); + + return NULL; +} + +tAsyncCall* System_Math_Tan(PTR pThis_, PTR pParams, PTR pReturnValue) { + *(double*)pReturnValue = tan(INTERNALCALL_PARAM(0, double)); + + return NULL; +} + +tAsyncCall* System_Math_Pow(PTR pThis_, PTR pParams, PTR pReturnValue) { + *(double*)pReturnValue = pow(INTERNALCALL_PARAM(0, double), INTERNALCALL_PARAM(8, double)); + + return NULL; +} + +tAsyncCall* System_Math_Sqrt(PTR pThis_, PTR pParams, PTR pReturnValue) { + *(double*)pReturnValue = sqrt(INTERNALCALL_PARAM(0, double)); + + return NULL; +} diff --git a/dna/System.Math.h b/dna/System.Math.h new file mode 100644 index 0000000..79d3bce --- /dev/null +++ b/dna/System.Math.h @@ -0,0 +1,32 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_MATH_H) +#define __SYSTEM_MATH_H + +#include "Types.h" + +tAsyncCall* System_Math_Sin(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Math_Cos(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Math_Tan(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Math_Pow(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Math_Sqrt(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif \ No newline at end of file diff --git a/dna/System.Net.Dns.c b/dna/System.Net.Dns.c new file mode 100644 index 0000000..2eb9ac6 --- /dev/null +++ b/dna/System.Net.Dns.c @@ -0,0 +1,63 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Net.Dns.h" + +#include "Type.h" +#include "System.Array.h" +#include "System.String.h" + +#ifndef WIN32 +#include +#endif + +tAsyncCall* System_Net_Dns_Internal_GetHostEnt(PTR pThis_, PTR pParams, PTR pReturnValue) { + struct hostent *pHostEnt; + U32 i, len; + STRING2 name2; + HEAP_PTR retArray; + U8 nameU8[256]; + + HEAP_PTR name = INTERNALCALL_PARAM(0, STRING); + HEAP_PTR *pHostName = INTERNALCALL_PARAM(4, STRING*); + + name2 = SystemString_GetString(name, &len); + for (i=0; ih_name); + + // Count how many entries there are + for (i=0; pHostEnt->h_addr_list[i] != NULL; i++); + + retArray = SystemArray_NewVector(types[TYPE_SYSTEM_ARRAY_INT32], i); + *(HEAP_PTR*)pReturnValue = retArray; + for (i=0; pHostEnt->h_addr_list[i] != NULL; i++) { + SystemArray_StoreElement(retArray, i, pHostEnt->h_addr_list[i]); + } + + return NULL; + +} diff --git a/dna/System.Net.Dns.h b/dna/System.Net.Dns.h new file mode 100644 index 0000000..028f3b1 --- /dev/null +++ b/dna/System.Net.Dns.h @@ -0,0 +1,26 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __SYSTEM_NET_DNS +#define __SYSTEM_NET_DNS + +tAsyncCall* System_Net_Dns_Internal_GetHostEnt(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif diff --git a/dna/System.Net.Sockets.Socket.c b/dna/System.Net.Sockets.Socket.c new file mode 100644 index 0000000..751b3d0 --- /dev/null +++ b/dna/System.Net.Sockets.Socket.c @@ -0,0 +1,364 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Net.Sockets.Socket.h" + +#include "System.Array.h" + +#ifdef WIN32 +#define ERRNO WSAGetLastError() +#define WOULDBLOCK WSAEWOULDBLOCK +#else +#include +#include +#include +#include +#define ERRNO errno +#define WOULDBLOCK EWOULDBLOCK +#endif + +void Socket_Init() { +#ifdef WIN32 + WSADATA d; + WSAStartup(0x0202, &d); +#endif +} + +tAsyncCall* System_Net_Sockets_Internal_CreateSocket(PTR pThis_, PTR pParams, PTR pReturnValue) { + + int s; + + U32 family = INTERNALCALL_PARAM(0, U32); + U32 type = INTERNALCALL_PARAM(4, U32); + U32 proto = INTERNALCALL_PARAM(8, U32); + U32 *pError = INTERNALCALL_PARAM(12, U32*); + + *(void**)pReturnValue = NULL; + + s = (int)socket(family, type, proto); + + if (s == -1) { + // Error + *pError = ERRNO; + s = 0; + } else { + *pError = 0; + } + + // Set socket to non-blocking +#ifdef WIN32 + { + u_long nonblock = 1; + ioctlsocket(s, FIONBIO, &nonblock); + } +#else + fcntl(s, F_SETFL, O_NONBLOCK); +#endif + + *(int*)pReturnValue = s; + + return NULL; +} + +tAsyncCall* System_Net_Sockets_Internal_Bind(PTR pThis_, PTR pParams, PTR pReturnValue) { + + struct sockaddr_in sa; + int r; + + int s = INTERNALCALL_PARAM(0, int); + U32 addr = INTERNALCALL_PARAM(4, U32); + U32 port = INTERNALCALL_PARAM(8, U32); + U32 *pError = INTERNALCALL_PARAM(12, U32*); + + sa.sin_family = AF_INET; +#ifdef WIN32 + sa.sin_addr.S_un.S_addr = addr; +#else + sa.sin_addr.s_addr = addr; +#endif + sa.sin_port = htons(port); + + r = bind(s, (struct sockaddr*)&sa, sizeof(sa)); + *pError = (r != 0)?ERRNO:0; + + return NULL; +} + +tAsyncCall* System_Net_Sockets_Internal_Close(PTR pThis_, PTR pParams, PTR pReturnValue) { + + int s = INTERNALCALL_PARAM(0, int); + +#ifdef WIN32 + closesocket(s); +#else + close(s); +#endif + + return NULL; +} + +tAsyncCall* System_Net_Sockets_Internal_Listen(PTR pThis_, PTR pParams, PTR pReturnValue) { + int s = INTERNALCALL_PARAM(0, int); + U32 backlog = INTERNALCALL_PARAM(4, U32); + U32 *pError = INTERNALCALL_PARAM(8, U32*); + + int r = listen(s, backlog); + + *pError = (r != 0)?ERRNO:0; + + return NULL; +} + +static U32 Accept_Check(PTR pThis_, PTR pParams, PTR pReturnValue, tAsyncCall *pAsync) { + int s = INTERNALCALL_PARAM(0, int); + U32 *pError = INTERNALCALL_PARAM(4, U32*); + int newS; + + newS = (int)accept(s, NULL, 0); + if (newS == -1) { + // Blocked or error + int err = ERRNO; + if (err == WOULDBLOCK) { + return 0; + } else { + *(U32*)pReturnValue = 0; + *pError = err; + return 1; + } + } else { + *(U32*)pReturnValue = newS; + *pError = 0; + return 1; + } +} + +tAsyncCall* System_Net_Sockets_Internal_Accept(PTR pThis_, PTR pParams, PTR pReturnValue) { + U32 ret = Accept_Check(pThis_, pParams, pReturnValue, NULL); + if (ret) { + return NULL; + } else { + tAsyncCall *pAsync = TMALLOC(tAsyncCall); + pAsync->sleepTime = -1; + pAsync->checkFn = Accept_Check; + pAsync->state = NULL; + return pAsync; + } +} + +static U32 Connect_Check(PTR pThis_, PTR pParams, PTR pReturnValue, tAsyncCall *pAsync) { + struct sockaddr_in sa; + int r; + + int s = INTERNALCALL_PARAM(0, int); + U32 addr = INTERNALCALL_PARAM(4, U32); + U32 port = INTERNALCALL_PARAM(8, U32); + U32 *pError = INTERNALCALL_PARAM(12, U32*); + + sa.sin_family = AF_INET; +#ifdef WIN32 + sa.sin_addr.S_un.S_addr = addr; +#else + sa.sin_addr.s_addr = addr; +#endif + sa.sin_port = htons(port); + + r = connect(s, (struct sockaddr*)&sa, sizeof(sa)); + //printf("Connect_Check: r=%d\n", r); + if (r == 0) { + *pError = 0; + return 1; + } else { + int err = ERRNO; + //printf("Connect_Check: errno=%d\n", err); +#ifdef WIN32 + if (err == WSAEINVAL || err == WSAEWOULDBLOCK || err == WSAEALREADY) { +#else + if (err == EINPROGRESS || err == EALREADY) { +#endif + // Still waiting for connection + return 0; + } else { +#ifdef WIN32 + if (err == WSAEISCONN) { +#else + if (err == EISCONN) { +#endif + // The connection is fine + err = 0; + } + // Connection failed + *pError = err; + return 1; + } + } +} + +tAsyncCall* System_Net_Sockets_Internal_Connect(PTR pThis_, PTR pParams, PTR pReturnValue) { + U32 ret = Connect_Check(pThis_, pParams, pReturnValue, NULL); + if (ret) { + return NULL; + } else { + tAsyncCall *pAsync = TMALLOC(tAsyncCall); + pAsync->sleepTime = -1; + pAsync->checkFn = Connect_Check; + pAsync->state = NULL; + return pAsync; + } +} + +typedef struct tSendRecvState_ tSendRecvState; +struct tSendRecvState_ { + // The number of bytes we've currently received + U32 count; +}; + +static U32 Receive_Check(PTR pThis_, PTR pParams, PTR pReturnValue, tAsyncCall *pAsync) { + PTR buffer; + int r; + tSendRecvState *pState = (tSendRecvState*)pAsync->state; + + int s = INTERNALCALL_PARAM(0, int); + HEAP_PTR bufferArray = INTERNALCALL_PARAM(4, HEAP_PTR); + U32 ofs = INTERNALCALL_PARAM(8, U32); + U32 size = INTERNALCALL_PARAM(12, U32); + U32 flags = INTERNALCALL_PARAM(16, U32); + U32 *pError = INTERNALCALL_PARAM(20, U32*); + + buffer = SystemArray_GetElements(bufferArray) + ofs + pState->count; + + r = recv(s, buffer, size, flags); + + if (r > 0) { + pState->count += r; + if (pState->count >= size) { + // Got all required data + *(U32*)pReturnValue = pState->count; + *pError = 0; + return 1; + } else { + // Still more data to come + return 0; + } + } else if (r == 0) { + // Connection has been closed, so finish + *(U32*)pReturnValue = pState->count; + *pError = 0; + return 1; + } else { + int err = ERRNO; + //printf("Receive_Check: errno=%d\n", err); +#ifdef WIN32 + if (err == WSAEINPROGRESS || err == WSAEWOULDBLOCK) { +#else + if (err == EAGAIN) { +#endif + // Still waiting for data + return 0; + } else { + *(U32*)pReturnValue = pState->count; + *pError = err; + return 1; + } + } +} + +tAsyncCall* System_Net_Sockets_Internal_Receive(PTR pThis_, PTR pParams, PTR pReturnValue) { + U32 ok; + tAsyncCall *pAsync = TMALLOC(tAsyncCall); + tSendRecvState *pState = TMALLOC(tSendRecvState); + pAsync->sleepTime = -1; + pAsync->checkFn = Receive_Check; + pAsync->state = (PTR)pState; + pState->count = 0; + ok = Receive_Check(pThis_, pParams, pReturnValue, pAsync); + if (ok) { + free(pState); + free(pAsync); + return NULL; + } else { + return pAsync; + } +} + +static U32 Send_Check(PTR pThis_, PTR pParams, PTR pReturnValue, tAsyncCall *pAsync) { + PTR buffer; + int r; + tSendRecvState *pState = (tSendRecvState*)pAsync->state; + + int s = INTERNALCALL_PARAM(0, int); + HEAP_PTR bufferArray = INTERNALCALL_PARAM(4, HEAP_PTR); + U32 ofs = INTERNALCALL_PARAM(8, U32); + U32 size = INTERNALCALL_PARAM(12, U32); + U32 flags = INTERNALCALL_PARAM(16, U32); + U32 *pError = INTERNALCALL_PARAM(20, U32*); + + buffer = SystemArray_GetElements(bufferArray) + ofs + pState->count; + + r = send(s, buffer, size, flags); + //printf("Send_Check: r=%d\n", r); + + if (r >= 0) { + pState->count += r; + if (pState->count >= size) { + // All data sent + *(U32*)pReturnValue = pState->count; + *pError = 0; + return 1; + } else { + // Still more data to come + return 0; + } + } else { + int err = ERRNO; +printf("Send_Check: errno=%d\n", err); +#ifdef WIN32 + if (err == WSAEINPROGRESS || err == WSAEWOULDBLOCK) { +#else + if (err == EAGAIN) { +#endif + return 0; + } else { + *(U32*)pReturnValue = pState->count; + *pError = err; + return 1; + } + } +} + +tAsyncCall* System_Net_Sockets_Internal_Send(PTR pThis_, PTR pParams, PTR pReturnValue) { + U32 ok; + tAsyncCall *pAsync = TMALLOC(tAsyncCall); + tSendRecvState *pState = TMALLOC(tSendRecvState); + pAsync->sleepTime = -1; + pAsync->checkFn = Receive_Check; + pAsync->state = (PTR)pState; + pState->count = 0; + ok = Send_Check(pThis_, pParams, pReturnValue, pAsync); + if (ok) { + free(pState); + free(pAsync); + return NULL; + } else { + return pAsync; + } +} diff --git a/dna/System.Net.Sockets.Socket.h b/dna/System.Net.Sockets.Socket.h new file mode 100644 index 0000000..4d72f0b --- /dev/null +++ b/dna/System.Net.Sockets.Socket.h @@ -0,0 +1,35 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_NET_SOCKETS_SOCKET_H) +#define __SYSTEM_NET_SOCKETS_SOCKET_H + +void Socket_Init(); + +tAsyncCall* System_Net_Sockets_Internal_CreateSocket(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Net_Sockets_Internal_Bind(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Net_Sockets_Internal_Close(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Net_Sockets_Internal_Listen(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Net_Sockets_Internal_Accept(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Net_Sockets_Internal_Connect(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Net_Sockets_Internal_Receive(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Net_Sockets_Internal_Send(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif diff --git a/dna/System.Object.c b/dna/System.Object.c new file mode 100644 index 0000000..bc8af0f --- /dev/null +++ b/dna/System.Object.c @@ -0,0 +1,60 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Object.h" + +#include "Types.h" +#include "Type.h" + +tAsyncCall* System_Object_Equals(PTR pThis_, PTR pParams, PTR pReturnValue) { + *(U32*)pReturnValue = (pThis_ == *(PTR*)pParams); + + return NULL; +} + +tAsyncCall* System_Object_Clone(PTR pThis_, PTR pParams, PTR pReturnValue) { + HEAP_PTR obj, clone; + + obj = ((HEAP_PTR*)pParams)[0]; + clone = Heap_Clone(obj); + *(HEAP_PTR*)pReturnValue = clone; + + return NULL; +} + +tAsyncCall* System_Object_GetHashCode(PTR pThis_, PTR pParams, PTR pReturnValue) { + *(U32*)pReturnValue = ((((U32)pThis_) >> 2) * 2654435761UL); + + return NULL; +} + +tAsyncCall* System_Object_GetType(PTR pThis_, PTR pParams, PTR pReturnValue) { + HEAP_PTR typeObject; + tMD_TypeDef *pTypeDef; + + pTypeDef = Heap_GetType((HEAP_PTR)pThis_); + typeObject = Type_GetTypeObject(pTypeDef); + *(HEAP_PTR*)pReturnValue = typeObject; + + return NULL; +} diff --git a/dna/System.Object.h b/dna/System.Object.h new file mode 100644 index 0000000..31329e2 --- /dev/null +++ b/dna/System.Object.h @@ -0,0 +1,32 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_OBJECT_H) +#define __SYSTEM_OBJECT_H + +#include "Types.h" +#include "MetaData.h" + +tAsyncCall* System_Object_Equals(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Object_Clone(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Object_GetHashCode(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Object_GetType(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif \ No newline at end of file diff --git a/dna/System.Runtime.CompilerServices.RuntimeHelpers.c b/dna/System.Runtime.CompilerServices.RuntimeHelpers.c new file mode 100644 index 0000000..676c4ee --- /dev/null +++ b/dna/System.Runtime.CompilerServices.RuntimeHelpers.c @@ -0,0 +1,47 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Runtime.CompilerServices.RuntimeHelpers.h" + +#include "MetaData.h" +#include "Types.h" +#include "Heap.h" +#include "Type.h" +#include "System.Array.h" + +tAsyncCall* System_Runtime_CompilerServices_InitializeArray(PTR pThis_, PTR pParams, PTR pReturnValue) { + HEAP_PTR pArray; + PTR pRawData; + tMD_TypeDef *pArrayTypeDef; + PTR pElements; + U32 arrayLength; + + pArray = ((HEAP_PTR*)pParams)[0]; + pRawData = ((PTR*)pParams)[1]; + pArrayTypeDef = Heap_GetType(pArray); + arrayLength = SystemArray_GetLength(pArray); + pElements = SystemArray_GetElements(pArray); + memcpy(pElements, pRawData, pArrayTypeDef->pArrayElementType->arrayElementSize * arrayLength); + + return NULL; +} diff --git a/dna/System.Runtime.CompilerServices.RuntimeHelpers.h b/dna/System.Runtime.CompilerServices.RuntimeHelpers.h new file mode 100644 index 0000000..ba3be04 --- /dev/null +++ b/dna/System.Runtime.CompilerServices.RuntimeHelpers.h @@ -0,0 +1,29 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_RUNTIME_COMPILERSERVICES_RUNTIMEHELPERS_H) +#define __SYSTEM_RUNTIME_COMPILERSERVICES_RUNTIMEHELPERS_H + +#include "MetaData.h" +#include "Types.h" + +tAsyncCall* System_Runtime_CompilerServices_InitializeArray(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif diff --git a/dna/System.RuntimeType.c b/dna/System.RuntimeType.c new file mode 100644 index 0000000..392ca64 --- /dev/null +++ b/dna/System.RuntimeType.c @@ -0,0 +1,151 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.RuntimeType.h" + +#include "Types.h" +#include "Type.h" +#include "Heap.h" +#include "System.String.h" +#include "System.RuntimeType.h" +#include "System.Array.h" + +HEAP_PTR RuntimeType_New(tMD_TypeDef *pTypeDef) { + tRuntimeType *pRuntimeType; + + pRuntimeType = (tRuntimeType*)Heap_AllocType(types[TYPE_SYSTEM_RUNTIMETYPE]); + Heap_MakeUndeletable((HEAP_PTR)pRuntimeType); + pRuntimeType->pTypeDef = pTypeDef; + + return (HEAP_PTR)pRuntimeType; +} + +tAsyncCall* System_RuntimeType_get_Name(PTR pThis_, PTR pParams, PTR pReturnValue) { + tRuntimeType *pRuntimeType = (tRuntimeType*)pThis_; + HEAP_PTR strResult; + + strResult = SystemString_FromCharPtrASCII(pRuntimeType->pTypeDef->name); + *(HEAP_PTR*)pReturnValue = strResult; + + return NULL; +} + +tAsyncCall* System_RuntimeType_get_Namespace(PTR pThis_, PTR pParams, PTR pReturnValue) { + tRuntimeType *pRuntimeType = (tRuntimeType*)pThis_; + HEAP_PTR strResult; + + strResult = SystemString_FromCharPtrASCII(pRuntimeType->pTypeDef->nameSpace); + *(HEAP_PTR*)pReturnValue = strResult; + + return NULL; +} + +tAsyncCall* System_RuntimeType_GetNestingParentType(PTR pThis_, PTR pParams, PTR pReturnValue) { + tRuntimeType *pRuntimeType = (tRuntimeType*)pThis_; + tMD_TypeDef *pNestingParentType; + + pNestingParentType = pRuntimeType->pTypeDef->pNestedIn; + if (pNestingParentType == NULL) { + *(HEAP_PTR*)pReturnValue = NULL; + } else { + *(HEAP_PTR*)pReturnValue = Type_GetTypeObject(pNestingParentType); + } + + return NULL; +} + +tAsyncCall* System_RuntimeType_get_BaseType(PTR pThis_, PTR pParams, PTR pReturnValue) { + tRuntimeType *pRuntimeType = (tRuntimeType*)pThis_; + tMD_TypeDef *pBaseType = pRuntimeType->pTypeDef->pParent; + + if (pBaseType == NULL) { + *(HEAP_PTR*)pReturnValue = NULL; + } else { + *(HEAP_PTR*)pReturnValue = Type_GetTypeObject(pBaseType); + } + + return NULL; +} + +tAsyncCall* System_RuntimeType_get_IsEnum(PTR pThis_, PTR pParams, PTR pReturnValue) { + tMD_TypeDef *pType = ((tRuntimeType*)pThis_)->pTypeDef; + + U32 isEnum = pType->pParent == types[TYPE_SYSTEM_ENUM]; + *(U32*)pReturnValue = isEnum; + + return NULL; +} + +tAsyncCall* System_RuntimeType_get_IsGenericType(PTR pThis_, PTR pParams, PTR pReturnValue) { + tMD_TypeDef *pType = ((tRuntimeType*)pThis_)->pTypeDef; + + *(U32*)pReturnValue = TYPE_ISGENERICINSTANCE(pType) || pType->isGenericDefinition; + return NULL; +} + +tAsyncCall* System_RuntimeType_Internal_GetGenericTypeDefinition(PTR pThis_, PTR pParams, PTR pReturnValue) { + tMD_TypeDef *pType = ((tRuntimeType*)pThis_)->pTypeDef; + + if (TYPE_ISGENERICINSTANCE(pType)) { + pType = pType->pGenericDefinition; + } + + *(HEAP_PTR*)pReturnValue = Type_GetTypeObject(pType); + + return NULL; +} + +tAsyncCall* System_RuntimeType_GetGenericArguments(PTR pThis_, PTR pParams, PTR pReturnValue) { + tMD_TypeDef *pType = ((tRuntimeType*)pThis_)->pTypeDef; + tMD_TypeDef *pCoreType; + U32 i, argCount = 0; + HEAP_PTR ret; + + pCoreType = pType->pGenericDefinition; + if (pCoreType != NULL) { + // Find the core instantiation of this type + tGenericInstance *pInst = pCoreType->pGenericInstances; + while (pInst != NULL) { + if (pInst->pInstanceTypeDef == pType) { + // Found it! + argCount = pInst->numTypeArgs; + } + pInst = pInst->pNext; + } + } + + ret = SystemArray_NewVector(types[TYPE_SYSTEM_ARRAY_TYPE], argCount); + // Allocate to return value straight away, so it cannot be GCed + *(HEAP_PTR*)pReturnValue = ret; + + for (i=0; ippClassTypeArgs[i]); + SystemArray_StoreElement(ret, i, (PTR)&argType); + } + + return NULL; +} + +tMD_TypeDef* RuntimeType_DeRef(PTR type) { + return ((tRuntimeType*)type)->pTypeDef; +} \ No newline at end of file diff --git a/dna/System.RuntimeType.h b/dna/System.RuntimeType.h new file mode 100644 index 0000000..a8da121 --- /dev/null +++ b/dna/System.RuntimeType.h @@ -0,0 +1,47 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_RUNTIMETYPE_H) +#define __SYSTEM_RUNTIMETYPE_H + +#include "Types.h" +#include "MetaData.h" + +typedef struct tRuntimeType_ tRuntimeType; +struct tRuntimeType_ { + // The pointer to the TypeDef object of this type. + tMD_TypeDef *pTypeDef; +}; + +tAsyncCall* System_RuntimeType_get_Name(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_RuntimeType_get_Namespace(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_RuntimeType_GetNestingParentType(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_RuntimeType_get_BaseType(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_RuntimeType_get_IsEnum(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_RuntimeType_get_IsGenericType(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_RuntimeType_Internal_GetGenericTypeDefinition(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_RuntimeType_GetGenericArguments(PTR pThis_, PTR pParams, PTR pReturnValue); + +// Create a new heap object which is the RuntimeType object for the given type. +HEAP_PTR RuntimeType_New(tMD_TypeDef *pTypeDef); +// De-ref a runtime type pointer +tMD_TypeDef* RuntimeType_DeRef(PTR type); + +#endif \ No newline at end of file diff --git a/dna/System.String.c b/dna/System.String.c new file mode 100644 index 0000000..58d92aa --- /dev/null +++ b/dna/System.String.c @@ -0,0 +1,399 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.String.h" + +#include "MetaData.h" +#include "Types.h" +#include "Heap.h" +#include "Type.h" +#include "System.Array.h" + +typedef struct tSystemString_ tSystemString; +// This structure must tie up with string.cs +struct tSystemString_ { + // Length in characters (not bytes) + U32 length; + // The characters + U16 chars[0]; +}; + +// length in characters, not bytes +static tSystemString* CreateStringHeapObj(U32 len) { + tSystemString *pSystemString; + U32 totalSize; + + totalSize = sizeof(tSystemString) + (len << 1); + pSystemString = (tSystemString*)Heap_Alloc(types[TYPE_SYSTEM_STRING], totalSize); + pSystemString->length = len; + return pSystemString; +} + +tAsyncCall* System_String_ctor_CharInt32(PTR pThis_, PTR pParams, PTR pReturnValue) { + tSystemString *pSystemString; + CHAR2 c; + U32 i, len; + + c = (CHAR2)(((U32*)pParams)[0]); + len = ((U32*)pParams)[1]; + pSystemString = CreateStringHeapObj(len); + for (i=0; ichars[i] = c; + } + *(HEAP_PTR*)pReturnValue = (HEAP_PTR)pSystemString; + + return NULL; +} + +tAsyncCall* System_String_ctor_CharAIntInt(PTR pThis_, PTR pParams, PTR pReturnValue) { + tSystemString *pSystemString; + HEAP_PTR charArray; + PTR charElements; + U32 startIndex, length; + + charArray = ((HEAP_PTR*)pParams)[0]; + startIndex = ((U32*)pParams)[1]; + length = ((U32*)pParams)[2]; + + charElements = SystemArray_GetElements(charArray); + pSystemString = CreateStringHeapObj(length); + memcpy(pSystemString->chars, charElements + (startIndex << 1), length << 1); + *(HEAP_PTR*)pReturnValue = (HEAP_PTR)pSystemString; + + return NULL; +} + +tAsyncCall* System_String_ctor_StringIntInt(PTR pThis_, PTR pParams, PTR pReturnValue) { + tSystemString *pThis, *pStr; + U32 startIndex, length; + + pStr = ((tSystemString**)pParams)[0]; + startIndex = ((U32*)pParams)[1]; + length = ((U32*)pParams)[2]; + + pThis = CreateStringHeapObj(length); + memcpy(pThis->chars, &pStr->chars[startIndex], length << 1); + *(HEAP_PTR*)pReturnValue = (HEAP_PTR)pThis; + + return NULL; +} + +tAsyncCall* System_String_get_Chars(PTR pThis_, PTR pParams, PTR pReturnValue) { + tSystemString *pThis = (tSystemString*)pThis_; + U32 index; + + index = *(U32*)pParams; + *(U32*)pReturnValue = pThis->chars[index]; + + return NULL; +} + +tAsyncCall* System_String_InternalConcat(PTR pThis_, PTR pParams, PTR pReturnValue) { + tSystemString *s0, *s1, *ret; + + s0 = (tSystemString*)(((HEAP_PTR*)pParams)[0]); + s1 = (tSystemString*)(((HEAP_PTR*)pParams)[1]); + ret = CreateStringHeapObj(s0->length + s1->length); + memcpy(ret->chars, s0->chars, s0->length << 1); + memcpy(&ret->chars[s0->length], s1->chars, s1->length << 1); + *(HEAP_PTR*)pReturnValue = (HEAP_PTR)ret; + + return NULL; +} + +tAsyncCall* System_String_InternalTrim(PTR pThis_, PTR pParams, PTR pReturnValue) { + tSystemString *pThis = (tSystemString*)pThis_; + HEAP_PTR pWhiteChars; + U32 trimType, i, j, checkCharsLen; + U32 ofsStart, ofsEnd; + U16 *pCheckChars; + U32 isWhiteSpace; + tSystemString *pRet; + U16 c; + + pWhiteChars = ((HEAP_PTR*)pParams)[0]; + trimType = ((U32*)pParams)[1]; + pCheckChars = (U16*)SystemArray_GetElements(pWhiteChars); + checkCharsLen = SystemArray_GetLength(pWhiteChars); + + ofsStart = 0; + ofsEnd = pThis->length; + if (trimType & 1) { + // Trim start + for (i=ofsStart; ichars[i]; + for (j=0; j=ofsStart; i--) { + // Check if each char is in the array + isWhiteSpace = 0; + c = pThis->chars[i]; + for (j=0; jchars, &pThis->chars[ofsStart], (ofsEnd - ofsStart) << 1); + *(HEAP_PTR*)pReturnValue = (HEAP_PTR)pRet; + + return NULL; +} + +tAsyncCall* System_String_Equals(PTR pThis_, PTR pParams, PTR pReturnValue) { + tSystemString *a, *b; + U32 ret; + + a = ((tSystemString**)pParams)[0]; + b = ((tSystemString**)pParams)[1]; + + if (a == b) { + ret = 1; + } else if (a == NULL || b == NULL || a->length != b->length) { + ret = 0; + } else { + ret = (memcmp(a->chars, b->chars, a->length<<1) == 0)?1:0; + } + *(U32*)pReturnValue = ret; + + return NULL; +} + +tAsyncCall* System_String_GetHashCode(PTR pThis_, PTR pParams, PTR pReturnValue) { + tSystemString *pThis = (tSystemString*)pThis_; + U16 *pChar, *pEnd; + I32 hash; + + hash = 0; + pChar = pThis->chars; + pEnd = pChar + pThis->length - 1; + for (; pChar < pEnd; pChar += 2) { + hash = (hash << 5) - hash + pChar[0]; + hash = (hash << 5) - hash + pChar[1]; + } + if (pChar <= pEnd) { + hash = (hash << 5) - hash + pChar[0]; + } + *(I32*)pReturnValue = hash; + + return NULL; +} + +tAsyncCall* System_String_InternalReplace(PTR pThis_, PTR pParams, PTR pReturnValue) { + tSystemString *pThis = (tSystemString*)pThis_; + tSystemString *pOld = ((tSystemString**)pParams)[0]; + tSystemString *pNew = ((tSystemString**)pParams)[1]; + tSystemString *pResult; + U32 thisLen, oldLen, newLen; + U16 *pThisChar0, *pOldChar0, *pNewChar0, *pResultChar0; + U32 i, j, replacements, dstIndex; + U32 resultLen; + + // This function (correctly) assumes that the old string is not empty + thisLen = pThis->length; + oldLen = pOld->length; + newLen = pNew->length; + pThisChar0 = pThis->chars; + pOldChar0 = pOld->chars; + pNewChar0 = pNew->chars; + + replacements = 0; + for (i=0; ichars; + dstIndex = 0; + for (i=0; ichars[i] == value) { + *(I32*)pReturnValue = i; + return NULL; + } + } + *(I32*)pReturnValue = -1; + return NULL; +} + +tAsyncCall* System_String_InternalIndexOfAny(PTR pThis_, PTR pParams, PTR pReturnValue) { + tSystemString *pThis = (tSystemString*)pThis_; + HEAP_PTR valueArray = ((HEAP_PTR*)pParams)[0]; + I32 startIndex = ((I32*)pParams)[1]; + I32 count = ((I32*)pParams)[2]; + U32 forwards = ((U32*)pParams)[3]; + + PTR valueChars = SystemArray_GetElements(valueArray); + U32 numValueChars = SystemArray_GetLength(valueArray); + + I32 lastIndex; + I32 inc; + I32 i, j; + + if (forwards) { + lastIndex = startIndex + count; + inc = 1; + i = startIndex; + } else { + lastIndex = startIndex - 1; + inc = -1; + i = startIndex + count - 1; + } + for (; i != lastIndex; i += inc) { + U16 thisChar = pThis->chars[i]; + for (j=numValueChars - 1; j>=0; j--) { + if (thisChar == ((U16*)valueChars)[j]) { + *(I32*)pReturnValue = i; + return NULL; + } + } + } + *(I32*)pReturnValue = -1; + return NULL; +} + +HEAP_PTR SystemString_FromUserStrings(tMetaData *pMetaData, IDX_USERSTRINGS index) { + unsigned int stringLen; + STRING2 string; + tSystemString *pSystemString; + + string = MetaData_GetUserString(pMetaData, index, &stringLen); + // Note: stringLen is in bytes + pSystemString = (tSystemString*)CreateStringHeapObj(stringLen >> 1); + memcpy(pSystemString->chars, string, stringLen); + return (HEAP_PTR)pSystemString; +} + +HEAP_PTR SystemString_FromCharPtrASCII(U8 *pStr) { + int stringLen, i; + tSystemString *pSystemString; + + stringLen = (int)strlen(pStr); + pSystemString = CreateStringHeapObj(stringLen); + for (i=0; ichars[i] = pStr[i]; + } + return (HEAP_PTR)pSystemString; +} + +HEAP_PTR SystemString_FromCharPtrUTF16(U16 *pStr) { + tSystemString *pSystemString; + int strLen = 0; + + while (pStr[strLen] != 0) { + strLen++; + } + pSystemString = CreateStringHeapObj(strLen); + memcpy(pSystemString->chars, pStr, strLen << 1); + return (HEAP_PTR)pSystemString; +} + +STRING2 SystemString_GetString(HEAP_PTR pThis_, U32 *pLength) { + tSystemString *pThis = (tSystemString*)pThis_; + + if (pLength != NULL) { + *pLength = pThis->length; + } + return pThis->chars; +} + +U32 SystemString_GetNumBytes(HEAP_PTR pThis_) { + return (((tSystemString*)pThis_)->length << 1) + sizeof(tSystemString); +} \ No newline at end of file diff --git a/dna/System.String.h b/dna/System.String.h new file mode 100644 index 0000000..2ad296b --- /dev/null +++ b/dna/System.String.h @@ -0,0 +1,45 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_STRING_H) +#define __SYSTEM_STRING_H + +#include "MetaData.h" +#include "Types.h" + +tAsyncCall* System_String_ctor_CharInt32(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_String_ctor_CharAIntInt(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_String_ctor_StringIntInt(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_String_get_Chars(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_String_InternalConcat(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_String_InternalTrim(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_String_Equals(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_String_GetHashCode(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_String_InternalReplace(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_String_InternalIndexOf(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_String_InternalIndexOfAny(PTR pThis_, PTR pParams, PTR pReturnValue); + +HEAP_PTR SystemString_FromUserStrings(tMetaData *pMetaData, IDX_USERSTRINGS index); +HEAP_PTR SystemString_FromCharPtrASCII(U8 *pStr); +HEAP_PTR SystemString_FromCharPtrUTF16(U16 *pStr); +STRING2 SystemString_GetString(HEAP_PTR pThis_, U32 *pLength); +U32 SystemString_GetNumBytes(HEAP_PTR pThis_); + +#endif \ No newline at end of file diff --git a/dna/System.Threading.Interlocked.c b/dna/System.Threading.Interlocked.c new file mode 100644 index 0000000..03d2f60 --- /dev/null +++ b/dna/System.Threading.Interlocked.c @@ -0,0 +1,75 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Threading.Interlocked.h" + +tAsyncCall* System_Threading_Interlocked_CompareExchange_Int32(PTR pThis_, PTR pParams, PTR pReturnValue) { + U32 *pLoc = INTERNALCALL_PARAM(0, U32*); + U32 value = INTERNALCALL_PARAM(4, U32); + U32 comparand = INTERNALCALL_PARAM(8, U32); + + *(U32*)pReturnValue = *pLoc; + if (*pLoc == comparand) { + *pLoc = value; + } + + return NULL; +} + +tAsyncCall* System_Threading_Interlocked_Increment_Int32(PTR pThis_, PTR pParams, PTR pReturnValue) { + I32 *pLoc = INTERNALCALL_PARAM(0, I32*); + + (*pLoc)++; + *(I32*)pReturnValue = *pLoc; + + return NULL; +} + +tAsyncCall* System_Threading_Interlocked_Decrement_Int32(PTR pThis_, PTR pParams, PTR pReturnValue) { + I32 *pLoc = INTERNALCALL_PARAM(0, I32*); + + (*pLoc)--; + *(I32*)pReturnValue = *pLoc; + + return NULL; +} + +tAsyncCall* System_Threading_Interlocked_Add_Int32(PTR pThis_, PTR pParams, PTR pReturnValue) { + U32 *pLoc = INTERNALCALL_PARAM(0, U32*); + U32 value = INTERNALCALL_PARAM(4, U32); + + *pLoc += value; + *(U32*)pReturnValue = *pLoc; + + return NULL; +} + +tAsyncCall* System_Threading_Interlocked_Exchange_Int32(PTR pThis_, PTR pParams, PTR pReturnValue) { + U32 *pLoc = INTERNALCALL_PARAM(0, U32*); + U32 value = INTERNALCALL_PARAM(4, U32); + + *(U32*)pReturnValue = *pLoc; + *pLoc = value; + + return NULL; +} diff --git a/dna/System.Threading.Interlocked.h b/dna/System.Threading.Interlocked.h new file mode 100644 index 0000000..77fa1e5 --- /dev/null +++ b/dna/System.Threading.Interlocked.h @@ -0,0 +1,30 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __SYSTEM_THREADING_INTERLOCKED_H +#define __SYSTEM_THREADING_INTERLOCKED_H + +tAsyncCall* System_Threading_Interlocked_CompareExchange_Int32(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Threading_Interlocked_Increment_Int32(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Threading_Interlocked_Decrement_Int32(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Threading_Interlocked_Add_Int32(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Threading_Interlocked_Exchange_Int32(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif diff --git a/dna/System.Threading.Monitor.c b/dna/System.Threading.Monitor.c new file mode 100644 index 0000000..5bd00ca --- /dev/null +++ b/dna/System.Threading.Monitor.c @@ -0,0 +1,81 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Threading.Monitor.h" + +#include "Type.h" +#include "Types.h" + +static U32 Internal_TryEntry_Check(PTR pThis_, PTR pParams, PTR pReturnValue, tAsyncCall *pAsync) { + HEAP_PTR pObj = ((HEAP_PTR*)pParams)[0]; + I32 timeout = ((I32*)pParams)[1]; + U32 ret = Heap_SyncTryEnter(pObj); + U64 now; + if (ret) { + // Lock achieved, so return that we've got it, and unblock this thread + *(U32*)pReturnValue = 1; + return 1; + } + // Can't get lock - check timeout + if (timeout < 0) { + // Infinite timeout, continue to block thread + return 0; + } + if (timeout == 0) { + // Timeout is 0, so always unblock, and return failure to get lock + *(U32*)pReturnValue = 0; + return 1; + } + if (pAsync == NULL) { + // This is the first time, so it can always block thread and wait + return 0; + } + now = msTime(); + if ((I32)(now - pAsync->startTime) > timeout) { + // Lock not got, but timeout has expired, unblock thread and return no lock + *(U32*)pReturnValue = 0; + return 1; + } + // Continue waiting, timeout not yet expired + return 0; +} + +tAsyncCall* System_Threading_Monitor_Internal_TryEnter(PTR pThis_, PTR pParams, PTR pReturnValue) { + U32 ok = Internal_TryEntry_Check(pThis_, pParams, pReturnValue, NULL); + tAsyncCall *pAsync; + if (ok) { + // Got lock already, so don't block thread + return NULL; + } + pAsync = TMALLOC(tAsyncCall); + pAsync->sleepTime = -1; + pAsync->checkFn = Internal_TryEntry_Check; + pAsync->state = NULL; + return pAsync; +} + +tAsyncCall* System_Threading_Monitor_Internal_Exit(PTR pThis_, PTR pParams, PTR pReturnValue) { + HEAP_PTR pObj = ((HEAP_PTR*)pParams)[0]; + Heap_SyncExit(pObj); + return ASYNC_LOCK_EXIT; +} diff --git a/dna/System.Threading.Monitor.h b/dna/System.Threading.Monitor.h new file mode 100644 index 0000000..ba39849 --- /dev/null +++ b/dna/System.Threading.Monitor.h @@ -0,0 +1,30 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_THREADING_MONITOR_H) +#define __SYSTEM_THREADING_MONITOR_H + +#include "MetaData.h" +#include "Types.h" + +tAsyncCall* System_Threading_Monitor_Internal_TryEnter(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Threading_Monitor_Internal_Exit(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif \ No newline at end of file diff --git a/dna/System.Threading.Thread.c b/dna/System.Threading.Thread.c new file mode 100644 index 0000000..b92015a --- /dev/null +++ b/dna/System.Threading.Thread.c @@ -0,0 +1,87 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Threading.Thread.h" + +#include "Types.h" +#include "Type.h" +#include "Delegate.h" +#include "Thread.h" + +tAsyncCall* System_Threading_Thread_ctor(PTR pThis_, PTR pParams, PTR pReturnValue) { + tThread *pThread = Thread(); + pThread->startDelegate = ((PTR*)pParams)[0]; + *(HEAP_PTR*)pReturnValue = (HEAP_PTR)pThread; + return NULL; +} + +tAsyncCall* System_Threading_Thread_ctorParam(PTR pThis_, PTR pParams, PTR pReturnValue) { + tThread *pThread = Thread(); + pThread->startDelegate = ((PTR*)pParams)[0]; + *(HEAP_PTR*)pReturnValue = (HEAP_PTR)pThread; + pThread->hasParam = 1; + return NULL; +} + +tAsyncCall* System_Threading_Thread_Start(PTR pThis_, PTR pParams, PTR pReturnValue) { + tThread *pThread = (tThread*)pThis_; + tMD_MethodDef *pStartMethod; + HEAP_PTR pStartObj; + PTR params[2]; + U32 paramBytes = 0; + + // This selects the RUNNING state (=0), without changing the IsBackground bit + pThread->state &= THREADSTATE_BACKGROUND; + + pStartMethod = Delegate_GetMethodAndStore(pThread->startDelegate, &pStartObj, NULL); + + if (pStartObj != NULL) { + // If this method is not static, so it has a start object, then make it the first parameter + params[0] = (PTR)pStartObj; + paramBytes = sizeof(void*); + } + if (pThread->hasParam) { + // If this method has an object parameter (ParameterizedThreadStart) + params[paramBytes] = (PTR)pThread->param; + paramBytes += sizeof(void*); + } + + Thread_SetEntryPoint(pThread, pStartMethod->pMetaData, pStartMethod->tableIndex, (PTR)¶ms, paramBytes); + + return NULL; +} + +tAsyncCall* System_Threading_Thread_Sleep(PTR pThis_, PTR pParams, PTR pReturnValue) { + tAsyncCall *pAsync = TMALLOC(tAsyncCall); + + pAsync->sleepTime = ((I32*)pParams)[0]; + + return pAsync; +} + +tAsyncCall* System_Threading_Thread_get_CurrentThread(PTR pThis_, PTR pParams, PTR pReturnValue) { + tThread *pThread = Thread_GetCurrent(); + *(HEAP_PTR*)pReturnValue = (HEAP_PTR)pThread; + + return NULL; +} diff --git a/dna/System.Threading.Thread.h b/dna/System.Threading.Thread.h new file mode 100644 index 0000000..eddadda --- /dev/null +++ b/dna/System.Threading.Thread.h @@ -0,0 +1,33 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_THREADING_THREAD_H) +#define __SYSTEM_THREADING_THREAD_H + +#include "MetaData.h" +#include "Types.h" + +tAsyncCall* System_Threading_Thread_ctor(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Threading_Thread_ctorParam(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Threading_Thread_Start(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Threading_Thread_Sleep(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Threading_Thread_get_CurrentThread(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif \ No newline at end of file diff --git a/dna/System.Type.c b/dna/System.Type.c new file mode 100644 index 0000000..f1a3bcf --- /dev/null +++ b/dna/System.Type.c @@ -0,0 +1,44 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Type.h" +#include "System.RuntimeType.h" + +#include "Types.h" +#include "Type.h" + +tAsyncCall* System_Type_GetTypeFromHandle(PTR pThis_, PTR pParams, PTR pReturnValue) { + tMD_TypeDef *pTypeDef = *(tMD_TypeDef**)pParams; + + *(HEAP_PTR*)pReturnValue = Type_GetTypeObject(pTypeDef); + + return NULL; +} + +tAsyncCall* System_Type_get_IsValueType(PTR pThis_, PTR pParams, PTR pReturnValue) { + tRuntimeType *pRuntimeType = (tRuntimeType*)pThis_; + + *(U32*)pReturnValue = pRuntimeType->pTypeDef->isValueType; + + return NULL; +} \ No newline at end of file diff --git a/dna/System.Type.h b/dna/System.Type.h new file mode 100644 index 0000000..8d0f1ee --- /dev/null +++ b/dna/System.Type.h @@ -0,0 +1,30 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_TYPE_H) +#define __SYSTEM_TYPE_H + +#include "Types.h" +#include "MetaData.h" + +tAsyncCall* System_Type_GetTypeFromHandle(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_Type_get_IsValueType(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif \ No newline at end of file diff --git a/dna/System.ValueType.c b/dna/System.ValueType.c new file mode 100644 index 0000000..4d83cce --- /dev/null +++ b/dna/System.ValueType.c @@ -0,0 +1,82 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.ValueType.h" + +#include "Types.h" +#include "MetaData.h" +#include "Heap.h" +#include "Type.h" +#include "System.Array.h" + +// Get all the fields in the value-types in the parameters. +// If the 2nd parameter is NULL, then don't include it! +// The type of the objects will always be identical. +tAsyncCall* System_ValueType_GetFields(PTR pThis_, PTR pParams, PTR pReturnValue) { + HEAP_PTR o1,o2, ret; + tMD_TypeDef *pType; + tMetaData *pMetaData; + U32 i, retOfs, numInstanceFields; + + o1 = ((HEAP_PTR*)pParams)[0]; + o2 = ((HEAP_PTR*)pParams)[1]; + pType = Heap_GetType(o1); + pMetaData = pType->pMetaData; + + numInstanceFields = 0; + for (i=0; inumFields; i++) { + if (!FIELD_ISSTATIC(pType->ppFields[i])) { + numInstanceFields++; + } + } + + ret = SystemArray_NewVector(types[TYPE_SYSTEM_ARRAY_OBJECT], numInstanceFields << ((o2 == NULL)?0:1)); + + retOfs = 0; + for (i=0; inumFields; i++) { + tMD_FieldDef *pField; + + pField = pType->ppFields[i]; + if (!FIELD_ISSTATIC(pField)) { + if (pField->pType->isValueType) { + HEAP_PTR boxed; + + boxed = Heap_Box(pField->pType, o1 + pField->memOffset); + SystemArray_StoreElement(ret, retOfs++, (PTR)&boxed); + if (o2 != NULL) { + boxed = Heap_Box(pField->pType, o2 + pField->memOffset); + SystemArray_StoreElement(ret, retOfs++, (PTR)&boxed); + } + } else { + SystemArray_StoreElement(ret, retOfs++, o1 + pField->memOffset); + if (o2 != NULL) { + SystemArray_StoreElement(ret, retOfs++, o2 + pField->memOffset); + } + } + } + } + + *(HEAP_PTR*)pReturnValue = ret; + + return NULL; +} diff --git a/dna/System.ValueType.h b/dna/System.ValueType.h new file mode 100644 index 0000000..8d56138 --- /dev/null +++ b/dna/System.ValueType.h @@ -0,0 +1,29 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_VALUETYPE_H) +#define __SYSTEM_VALUETYPE_H + +#include "MetaData.h" +#include "Types.h" + +tAsyncCall* System_ValueType_GetFields(PTR pThis_, PTR pParams, PTR pReturnValue); + +#endif \ No newline at end of file diff --git a/dna/System.WeakReference.c b/dna/System.WeakReference.c new file mode 100644 index 0000000..526442c --- /dev/null +++ b/dna/System.WeakReference.c @@ -0,0 +1,88 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "System.Array.h" + +#include "Types.h" +#include "MetaData.h" +#include "Heap.h" +#include "Type.h" + +typedef struct tWeakRef_ tWeakRef; +struct tWeakRef_ { + // The target of this weak-ref + HEAP_PTR target; + // Does this weak-ref track resurrection? + U32 trackRes; + // Link to the next weak-ref that points to the same target + tWeakRef *pNextWeakRef; +}; + +tAsyncCall* System_WeakReference_get_Target(PTR pThis_, PTR pParams, PTR pReturnValue) { + tWeakRef *pThis = (tWeakRef*)pThis_; + *(HEAP_PTR*)pReturnValue = pThis->target; + return NULL; +} + +tAsyncCall* System_WeakReference_set_Target(PTR pThis_, PTR pParams, PTR pReturnValue) { + tWeakRef *pThis = (tWeakRef*)pThis_; + HEAP_PTR target = ((HEAP_PTR*)pParams)[0]; + + if (pThis->target != NULL) { + tWeakRef **ppWeakRef = (tWeakRef**)Heap_GetWeakRefAddress(pThis->target); + while (*ppWeakRef != NULL) { + tWeakRef *pWeakRef = *ppWeakRef; + if (pWeakRef == pThis) { + *ppWeakRef = pWeakRef->pNextWeakRef; + Heap_RemovedWeakRefTarget(pWeakRef->target); + goto foundOK; + } + ppWeakRef = &(pWeakRef->pNextWeakRef); + } + Crash("WeakRef.set_Target() Error: cannot find weak-ref target for removal"); +foundOK:; + } + pThis->target = target; + if (target != NULL) { + pThis->pNextWeakRef = (tWeakRef*)Heap_SetWeakRefTarget(target, (HEAP_PTR)pThis); + } + + return NULL; +} + +void SystemWeakReference_TargetGone(HEAP_PTR *ppWeakRef_, U32 removeLongRefs) { + tWeakRef **ppWeakRef = (tWeakRef**)ppWeakRef_; + tWeakRef *pWeakRef = *ppWeakRef; + while (pWeakRef != NULL) { + if (removeLongRefs || !pWeakRef->trackRes) { + // Really remove it + pWeakRef->target = NULL; + } else { + // Long ref, so keep it + *ppWeakRef = pWeakRef; + ppWeakRef = &(pWeakRef->pNextWeakRef); + } + pWeakRef = pWeakRef->pNextWeakRef; + } + *ppWeakRef = NULL; +} diff --git a/dna/System.WeakReference.h b/dna/System.WeakReference.h new file mode 100644 index 0000000..070a000 --- /dev/null +++ b/dna/System.WeakReference.h @@ -0,0 +1,32 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__SYSTEM_WEAKREFERENCE_H) +#define __SYSTEM_WEAKREFERENCE_H + +#include "MetaData.h" +#include "Types.h" + +tAsyncCall* System_WeakReference_get_Target(PTR pThis_, PTR pParams, PTR pReturnValue); +tAsyncCall* System_WeakReference_set_Target(PTR pThis_, PTR pParams, PTR pReturnValue); + +void SystemWeakReference_TargetGone(HEAP_PTR *ppWeakRef_, U32 removeLongRefs); + +#endif \ No newline at end of file diff --git a/dna/Thread.c b/dna/Thread.c new file mode 100644 index 0000000..e3f3400 --- /dev/null +++ b/dna/Thread.c @@ -0,0 +1,262 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "Thread.h" + +#include "MethodState.h" +#include "Heap.h" +#include "Type.h" + +static tThread *pAllThreads = NULL; +static tThread *pCurrentThread; + +tThread* Thread() { + static U32 threadID = 0; + tThread *pThis; + + // Create thread and initial method state. This is allocated on the managed heap, and + // mark as undeletable. When the thread exits, it was marked as deletable. + pThis = (tThread*)Heap_AllocType(types[TYPE_SYSTEM_THREADING_THREAD]); + Heap_MakeUndeletable((HEAP_PTR)pThis); + pThis->threadID = ++threadID; + pThis->pCurrentMethodState = NULL; + pThis->threadExitValue = 0; + pThis->nextFinallyUnwindStack = 0; + pThis->pAsync = NULL; + pThis->hasParam = 0; + + pThis->startDelegate = NULL; + pThis->param = NULL; + pThis->state = THREADSTATE_UNSTARTED; + + // Allocate the first chunk of thread-local stack + pThis->pThreadStack = TMALLOC(tThreadStack); + pThis->pThreadStack->ofs = 0; + pThis->pThreadStack->pNext = NULL; + + // Add to list of all thread + pThis->pNextThread = pAllThreads; + pAllThreads = pThis; + + return pThis; +} + +void* Thread_StackAlloc(tThread *pThread, U32 size) { + tThreadStack *pStack = pThread->pThreadStack; + void *pAddr = pStack->memory + pStack->ofs; +#if _DEBUG + *(U32*)pAddr = 0xabababab; + ((U32*)pAddr)++; + pStack->ofs += 4; +#endif + pStack->ofs += size; + if (pStack->ofs > THREADSTACK_CHUNK_SIZE) { + Crash("Thread-local stack is too large"); + } +#if _DEBUG + memset(pAddr, 0xcd, size); + *(U32*)(((char*)pAddr) + size) = 0xfbfbfbfb; + pStack->ofs += 4; +#endif + return pAddr; +} + +void Thread_StackFree(tThread *pThread, void *pAddr) { + tThreadStack *pStack = pThread->pThreadStack; +#if _DEBUG + ((U32*)pAddr)--; + memset(pAddr, 0xfe, pStack->ofs - (U32)(((unsigned char*)pAddr) - pStack->memory)); +#endif + pStack->ofs = (U32)(((unsigned char*)pAddr) - pStack->memory); +} + +void Thread_SetEntryPoint(tThread *pThis, tMetaData *pMetaData, IDX_TABLE entryPointToken, PTR params, U32 paramBytes) { + // Set up the initial MethodState + pThis->pCurrentMethodState = MethodState(pThis, pMetaData, entryPointToken, NULL); + // Insert initial parameters (if any) + if (paramBytes > 0) { + memcpy(pThis->pCurrentMethodState->pParamsLocals, params, paramBytes); + } +} + +static void Thread_Delete(tThread *pThis) { + tThreadStack *pStack = pThis->pThreadStack; + while (pStack != NULL) { + tThreadStack *pNextStack = pStack->pNext; + free(pStack); + pStack = pNextStack; + } + Heap_MakeDeletable((HEAP_PTR)pThis); +} + +I32 Thread_Execute() { + tThread *pThread, *pPrevThread; + U32 status; + + pThread = pAllThreads; + // Set the initial thread to the RUNNING state. + pThread->state = THREADSTATE_RUNNING; + // Set the initial CurrentThread + pCurrentThread = pThread; + + for (;;) { + U32 minSleepTime = 0xffffffff; + I32 threadExitValue; + + status = JIT_Execute(pThread, 100); + switch (status) { + case THREAD_STATUS_EXIT: + threadExitValue = pThread->threadExitValue; + log_f(1, "Thread ID#%d exited. Return value: %d\n", (int)pThread->threadID, (int)threadExitValue); + // Remove the current thread from the running threads list. + // Note that this list may have changed since before the call to JIT_Execute(). + { + tThread **ppThread = &pAllThreads; + while (*ppThread != pThread) { + ppThread = &((*ppThread)->pNextThread); + } + *ppThread = (*ppThread)->pNextThread; + } + // Delete the current thread + Thread_Delete(pThread); + // If there are no more threads left running, then exit application (by returning) + // Threads that are unstarted or background do not stop the exit + { + tThread *pThread = pAllThreads; + U32 canExit = 1; + while (pThread != NULL) { + if ((!(pThread->state & THREADSTATE_BACKGROUND)) && ((pThread->state & (~THREADSTATE_BACKGROUND)) != THREADSTATE_UNSTARTED)) { + canExit = 0; + break; + } + pThread = pThread->pNextThread; + } + if (canExit) { + return threadExitValue; + } + } + pThread = pAllThreads; // This is not really correct, but it'll work for the time being + break; + case THREAD_STATUS_RUNNING: + case THREAD_STATUS_LOCK_EXIT: + // Nothing to do + break; + case THREAD_STATUS_ASYNC: + pThread->pAsync->startTime = msTime(); + break; + } + + // Move on to the next thread. + // Find the next thread that isn't sleeping or blocked on IO + pPrevThread = pThread; + for (;;) { + pThread = pThread->pNextThread; + if (pThread == NULL) { + pThread = pAllThreads; + } + // Set the CurrentThread correctly + pCurrentThread = pThread; + if ((pThread->state & (~THREADSTATE_BACKGROUND)) != 0) { + // Thread is not running + continue; + } + if (pThread->pAsync != NULL) { + // Discover if whatever is being waited for is finished + tAsyncCall *pAsync = pThread->pAsync; + if (pAsync->sleepTime >= 0) { + // This is a sleep + U64 nowTime = msTime(); + I32 msSleepRemaining = pAsync->sleepTime - (I32)(nowTime - pAsync->startTime); + if (msSleepRemaining <= 0) { + // Sleep is finished + break; + } + // Sleep is not finished, so continue to next thread + if ((U32)msSleepRemaining < minSleepTime) { + minSleepTime = msSleepRemaining; + } + } else { + // This is blocking IO, or a lock + tMethodState *pMethodState = pThread->pCurrentMethodState; + PTR pThis; + U32 thisOfs; + U32 unblocked; + + if (METHOD_ISSTATIC(pMethodState->pMethod)) { + pThis = NULL; + thisOfs = 0; + } else { + pThis = *(PTR*)pMethodState->pParamsLocals; + thisOfs = 4; + } + unblocked = pAsync->checkFn(pThis, pMethodState->pParamsLocals + thisOfs, pMethodState->pEvalStack, pAsync); + if (unblocked) { + // The IO has unblocked, and the return value is ready. + // So delete the async object. + // TODO: The async->state object needs to be deleted somehow (maybe) + free(pAsync); + // And remove it from the thread + pThread->pAsync = NULL; + break; + } + minSleepTime = 5; + } + } else { + // Thread is ready to run + break; + } + if (pThread == pPrevThread) { + // When it gets here, it means that all threads are currently blocked. + //printf("All blocked; sleep(%d)\n", minSleepTime); + SleepMS(minSleepTime); + } + } + } + +} + +tThread* Thread_GetCurrent() { + return pCurrentThread; +} + +void Thread_GetHeapRoots(tHeapRoots *pHeapRoots) { + tThread *pThread; + + pThread = pAllThreads; + while (pThread != NULL) { + tMethodState *pMethodState; + + pMethodState = pThread->pCurrentMethodState; + while (pMethodState != NULL) { + // Put the evaluation stack on the roots + Heap_SetRoots(pHeapRoots, pMethodState->pEvalStack, pMethodState->pMethod->pJITted->maxStack); + // Put the params/locals on the roots + Heap_SetRoots(pHeapRoots, pMethodState->pParamsLocals, + pMethodState->pMethod->parameterStackSize+pMethodState->pMethod->pJITted->localsStackSize); + + pMethodState = pMethodState->pCaller; + } + + pThread = pThread->pNextThread; + } +} diff --git a/dna/Thread.h b/dna/Thread.h new file mode 100644 index 0000000..653a1a3 --- /dev/null +++ b/dna/Thread.h @@ -0,0 +1,110 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__THREAD_H) +#define __THREAD_H + +typedef struct tThread_ tThread; +typedef struct tThreadStack_ tThreadStack; + +#include "MetaData.h" +#include "MethodState.h" +#include "Heap.h" +#include "Types.h" + +#define THREADSTACK_CHUNK_SIZE 10000 + +struct tThreadStack_ { + // This chunk of stack memory + unsigned char memory[THREADSTACK_CHUNK_SIZE]; + // Current offset into this memory chunk + U32 ofs; + // Pointer to the next chunk. + tThreadStack *pNext; +}; + +struct tThread_ { + // Stuff that's synced with Thread.cs + // The threadID of this thread + U32 threadID; + // The delegate that this thread starts by executing + PTR startDelegate; + // The parameter to pass to the starting method (this is ignored if no parameter is needed). + HEAP_PTR param; + // The current state of the thread (running/paused/etc...) + U32 state; + // The current culture of the thread. Never accessed in C + void *pCurrentCulture; + + // Stuff that is independant of Thread.cs + // Note that the size of this can be anything we like, as the size of the Thread .NET type is ignored. + + // This thread's currently executing method + tMethodState *pCurrentMethodState; + // Thread exit value + I32 threadExitValue; + // The current exception object of this thread (for use by RETHROW) + HEAP_PTR pCurrentExceptionObject; + // When unwinding the stack after a throw, this keeps track of which finally clauses have already been executed + U32 nextFinallyUnwindStack; + // And the method state that we're aiming for.. + tMethodState *pCatchMethodState; + // And the exception catch handler we're aiming for... + tExceptionHeader *pCatchExceptionHandler; + // If this thread is waiting on async data, then the details are stored here + tAsyncCall *pAsync; + // Does this thread start with a parameter? + U32 hasParam; + // Pointer to the first chunk of thread-stack memory + tThreadStack *pThreadStack; + + // The next thread in the system (needed for garbage collection and theading) + tThread *pNextThread; +}; + +// The thread has finished +#define THREAD_STATUS_EXIT 1 +// The thread is still running, but has completed its timeslot +#define THREAD_STATUS_RUNNING 2 +// The thread is waiting on some async data (sleep or IO) +#define THREAD_STATUS_ASYNC 3 +// The thread has just exited a lock, so allow other threads to acquire it if they are waiting +#define THREAD_STATUS_LOCK_EXIT 4 + +#define ASYNC_LOCK_EXIT ((tAsyncCall*)0x00000001) + +// These are the same as the C# definitions in corelib, +// and can be ORed together. +#define THREADSTATE_RUNNING 0x0000 +#define THREADSTATE_BACKGROUND 0x0004 +#define THREADSTATE_UNSTARTED 0x0008 +#define THREADSTATE_STOPPED 0x0010 +#define THREADSTATE_SUSPENDED 0x0040 + +tThread* Thread(); +void Thread_SetEntryPoint(tThread *pThis, tMetaData *pMetaData, IDX_TABLE entryPointToken, PTR params, U32 paramBytes); +I32 Thread_Execute(); +tThread* Thread_GetCurrent(); +void* Thread_StackAlloc(tThread *pThread, U32 size); +void Thread_StackFree(tThread *pThread, void *pAddr); + +void Thread_GetHeapRoots(tHeapRoots *pHeapRoots); + +#endif diff --git a/dna/Type.c b/dna/Type.c new file mode 100644 index 0000000..d227c7e --- /dev/null +++ b/dna/Type.c @@ -0,0 +1,518 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "Type.h" + +#include "MetaData.h" +#include "Types.h" +#include "EvalStack.h" +#include "Generics.h" +#include "System.RuntimeType.h" +#include "Thread.h" + +typedef struct tArrayTypeDefs_ tArrayTypeDefs; +struct tArrayTypeDefs_ { + tMD_TypeDef *pArrayType; + tMD_TypeDef *pElementType; + + tArrayTypeDefs *pNext; +}; + +static tArrayTypeDefs *pArrays; + +#define GENERICARRAYMETHODS_NUM 13 +static U8 genericArrayMethodsInited = 0; +static tMD_MethodDef *ppGenericArrayMethods[GENERICARRAYMETHODS_NUM]; + +#define GENERICARRAYMETHODS_Internal_GetGenericEnumerator 0 +#define GENERICARRAYMETHODS_get_Length 1 +#define GENERICARRAYMETHODS_get_IsReadOnly 2 +#define GENERICARRAYMETHODS_Internal_GenericAdd 3 +#define GENERICARRAYMETHODS_Internal_GenericClear 4 +#define GENERICARRAYMETHODS_Internal_GenericContains 5 +#define GENERICARRAYMETHODS_Internal_GenericCopyTo 6 +#define GENERICARRAYMETHODS_Internal_GenericRemove 7 +#define GENERICARRAYMETHODS_Internal_GenericIndexOf 8 +#define GENERICARRAYMETHODS_Internal_GenericInsert 9 +#define GENERICARRAYMETHODS_Internal_GenericRemoveAt 10 +#define GENERICARRAYMETHODS_Internal_GenericGetItem 11 +#define GENERICARRAYMETHODS_Internal_GenericSetItem 12 +static char *pGenericArrayMethodsInit[GENERICARRAYMETHODS_NUM] = { + "Internal_GetGenericEnumerator", + "get_Length", + "Internal_GenericIsReadOnly", + "Internal_GenericAdd", + "Internal_GenericClear", + "Internal_GenericContains", + "Internal_GenericCopyTo", + "Internal_GenericRemove", + "Internal_GenericIndexOf", + "Internal_GenericInsert", + "Internal_GenericRemoveAt", + "Internal_GenericGetItem", + "Internal_GenericSetItem", +}; + +static void GetMethodDefs() { + IDX_TABLE token, last; + tMetaData *pMetaData; + + pMetaData = types[TYPE_SYSTEM_ARRAY_NO_TYPE]->pMetaData; + last = types[TYPE_SYSTEM_ARRAY_NO_TYPE]->isLast? + MAKE_TABLE_INDEX(MD_TABLE_METHODDEF, pMetaData->tables.numRows[MD_TABLE_METHODDEF]): + (types[TYPE_SYSTEM_ARRAY_NO_TYPE][1].methodList - 1); + token = types[TYPE_SYSTEM_ARRAY_NO_TYPE]->methodList; + for (; token <= last; token++) { + tMD_MethodDef *pMethod; + U32 i; + + pMethod = (tMD_MethodDef*)MetaData_GetTableRow(pMetaData, token); + for (i=0; iname, pGenericArrayMethodsInit[i]) == 0) { + ppGenericArrayMethods[i] = pMethod; + break; + } + } + + } + genericArrayMethodsInited = 1; +} + +static void CreateNewArrayType(tMD_TypeDef *pNewArrayType, tMD_TypeDef *pElementType, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs) { + MetaData_Fill_TypeDef(types[TYPE_SYSTEM_ARRAY_NO_TYPE], NULL, NULL); + + memcpy(pNewArrayType, types[TYPE_SYSTEM_ARRAY_NO_TYPE], sizeof(tMD_TypeDef)); + pNewArrayType->pArrayElementType = pElementType; + pNewArrayType->isFilled = 1; + + // Auto-generate the generic interfaces IEnumerable, ICollection and IList for this array + { + tInterfaceMap *pInterfaceMap, *pAllIMs; + tMD_TypeDef *pInterfaceT; + tMD_MethodDef *pMethod; + U32 orgNumInterfaces; + + if (genericArrayMethodsInited == 0) { + GetMethodDefs(); + } + + orgNumInterfaces = pNewArrayType->numInterfaces; + pNewArrayType->numInterfaces += 3; + pAllIMs = (tInterfaceMap*)mallocForever(pNewArrayType->numInterfaces * sizeof(tInterfaceMap)); + memcpy(pAllIMs, pNewArrayType->pInterfaceMaps, orgNumInterfaces * sizeof(tInterfaceMap)); + pNewArrayType->pInterfaceMaps = pAllIMs; + + // Get the IEnumerable interface + pInterfaceMap = &pAllIMs[orgNumInterfaces + 0]; + pInterfaceT = Generics_GetGenericTypeFromCoreType(types[TYPE_SYSTEM_COLLECTIONS_GENERIC_IENUMERABLE_T], 1, &pElementType); + pInterfaceMap->pInterface = pInterfaceT; + pInterfaceMap->pVTableLookup = NULL; + pInterfaceMap->ppMethodVLookup = mallocForever(pInterfaceT->numVirtualMethods * sizeof(tMD_MethodDef*)); + pMethod = Generics_GetMethodDefFromCoreMethod(ppGenericArrayMethods[GENERICARRAYMETHODS_Internal_GetGenericEnumerator], pNewArrayType, 1, &pElementType); + pInterfaceMap->ppMethodVLookup[0] = pMethod; + + // Get the ICollection interface + pInterfaceMap = &pAllIMs[orgNumInterfaces + 1]; + pInterfaceT = Generics_GetGenericTypeFromCoreType(types[TYPE_SYSTEM_COLLECTIONS_GENERIC_ICOLLECTION_T], 1, &pElementType); + pInterfaceMap->pInterface = pInterfaceT; + pInterfaceMap->pVTableLookup = NULL; + pInterfaceMap->ppMethodVLookup = mallocForever(pInterfaceT->numVirtualMethods * sizeof(tMD_MethodDef*)); + pInterfaceMap->ppMethodVLookup[0] = ppGenericArrayMethods[GENERICARRAYMETHODS_get_Length]; + pInterfaceMap->ppMethodVLookup[1] = ppGenericArrayMethods[GENERICARRAYMETHODS_get_IsReadOnly]; + pInterfaceMap->ppMethodVLookup[2] = Generics_GetMethodDefFromCoreMethod(ppGenericArrayMethods[GENERICARRAYMETHODS_Internal_GenericAdd], pNewArrayType, 1, &pElementType); + pInterfaceMap->ppMethodVLookup[3] = ppGenericArrayMethods[GENERICARRAYMETHODS_Internal_GenericClear]; + pInterfaceMap->ppMethodVLookup[4] = Generics_GetMethodDefFromCoreMethod(ppGenericArrayMethods[GENERICARRAYMETHODS_Internal_GenericContains], pNewArrayType, 1, &pElementType); + pInterfaceMap->ppMethodVLookup[5] = Generics_GetMethodDefFromCoreMethod(ppGenericArrayMethods[GENERICARRAYMETHODS_Internal_GenericCopyTo], pNewArrayType, 1, &pElementType); + pInterfaceMap->ppMethodVLookup[6] = Generics_GetMethodDefFromCoreMethod(ppGenericArrayMethods[GENERICARRAYMETHODS_Internal_GenericRemove], pNewArrayType, 1, &pElementType); + + // Get the IList interface + pInterfaceMap = &pAllIMs[orgNumInterfaces + 2]; + pInterfaceT = Generics_GetGenericTypeFromCoreType(types[TYPE_SYSTEM_COLLECTIONS_GENERIC_ILIST_T], 1, &pElementType); //, ppClassTypeArgs, ppMethodTypeArgs); + pInterfaceMap->pInterface = pInterfaceT; + pInterfaceMap->pVTableLookup = NULL; + pInterfaceMap->ppMethodVLookup = mallocForever(pInterfaceT->numVirtualMethods * sizeof(tMD_MethodDef*)); + pInterfaceMap->ppMethodVLookup[0] = Generics_GetMethodDefFromCoreMethod(ppGenericArrayMethods[GENERICARRAYMETHODS_Internal_GenericIndexOf], pNewArrayType, 1, &pElementType); + pInterfaceMap->ppMethodVLookup[1] = Generics_GetMethodDefFromCoreMethod(ppGenericArrayMethods[GENERICARRAYMETHODS_Internal_GenericInsert], pNewArrayType, 1, &pElementType); + pInterfaceMap->ppMethodVLookup[2] = ppGenericArrayMethods[GENERICARRAYMETHODS_Internal_GenericRemoveAt]; + pInterfaceMap->ppMethodVLookup[3] = Generics_GetMethodDefFromCoreMethod(ppGenericArrayMethods[GENERICARRAYMETHODS_Internal_GenericGetItem], pNewArrayType, 1, &pElementType); + pInterfaceMap->ppMethodVLookup[4] = Generics_GetMethodDefFromCoreMethod(ppGenericArrayMethods[GENERICARRAYMETHODS_Internal_GenericSetItem], pNewArrayType, 1, &pElementType); + } + + log_f(2, "Array: Array[%s.%s]\n", pElementType->nameSpace, pElementType->name); +} + +// Returns a TypeDef for an array to the given element type +tMD_TypeDef* Type_GetArrayTypeDef(tMD_TypeDef *pElementType, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs) { + tArrayTypeDefs *pIterArrays; + + if (pElementType == NULL) { + return types[TYPE_SYSTEM_ARRAY_NO_TYPE]; + } + + pIterArrays = pArrays; + while (pIterArrays != NULL) { + if (pIterArrays->pElementType == pElementType) { + return pIterArrays->pArrayType; + } + pIterArrays = pIterArrays->pNext; + } + + // Must have this new array type in the linked-list of array types before it is initialised + // (otherwise it can get stuck in an infinite loop) + pIterArrays = TMALLOCFOREVER(tArrayTypeDefs); + pIterArrays->pElementType = pElementType; + pIterArrays->pNext = pArrays; + pArrays = pIterArrays; + pIterArrays->pArrayType = TMALLOC(tMD_TypeDef); + + CreateNewArrayType(pIterArrays->pArrayType, pElementType, ppClassTypeArgs, ppMethodTypeArgs); + return pIterArrays->pArrayType; +} + +U32 Type_IsValueType(tMD_TypeDef *pTypeDef) { + // If this type is an interface, then return 0 + if (TYPE_ISINTERFACE(pTypeDef)) { + return 0; + } + // If this type is Object or ValueType then return an answer + if (strcmp(pTypeDef->nameSpace, "System") == 0) { + if (strcmp(pTypeDef->name, "ValueType") == 0) { + return 1; + } + if (strcmp(pTypeDef->name, "Object") == 0) { + return 0; + } + } + // Return the isValueType determined by parent type + pTypeDef = MetaData_GetTypeDefFromDefRefOrSpec(pTypeDef->pMetaData, pTypeDef->extends, NULL, NULL); + MetaData_Fill_TypeDef(pTypeDef, NULL, NULL); + return pTypeDef->isValueType; +} + +// Get the TypeDef from the type signature +// Also get the size of a field from the signature +// This is needed to avoid recursive sizing of types like System.Boolean, +// that has a field of type System.Boolean +tMD_TypeDef* Type_GetTypeFromSig(tMetaData *pMetaData, SIG *pSig, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs) { + U32 entry; + + entry = MetaData_DecodeSigEntry(pSig); + switch (entry) { + case ELEMENT_TYPE_VOID: + return NULL; + + case ELEMENT_TYPE_BOOLEAN: + return types[TYPE_SYSTEM_BOOLEAN]; + + case ELEMENT_TYPE_CHAR: + return types[TYPE_SYSTEM_CHAR]; + + case ELEMENT_TYPE_I1: + return types[TYPE_SYSTEM_SBYTE]; + + case ELEMENT_TYPE_U1: + return types[TYPE_SYSTEM_BYTE]; + + case ELEMENT_TYPE_I2: + return types[TYPE_SYSTEM_INT16]; + + case ELEMENT_TYPE_U2: + return types[TYPE_SYSTEM_UINT16]; + + case ELEMENT_TYPE_I4: + return types[TYPE_SYSTEM_INT32]; + + case ELEMENT_TYPE_I8: + return types[TYPE_SYSTEM_INT64]; + + case ELEMENT_TYPE_U8: + return types[TYPE_SYSTEM_UINT64]; + + case ELEMENT_TYPE_U4: + return types[TYPE_SYSTEM_UINT32]; + + case ELEMENT_TYPE_R4: + return types[TYPE_SYSTEM_SINGLE]; + + case ELEMENT_TYPE_R8: + return types[TYPE_SYSTEM_DOUBLE]; + + case ELEMENT_TYPE_STRING: + return types[TYPE_SYSTEM_STRING]; + + case ELEMENT_TYPE_PTR: + return types[TYPE_SYSTEM_UINTPTR]; + + case ELEMENT_TYPE_BYREF: + { + tMD_TypeDef *pByRefType; + + // type of the by-ref parameter, don't care + pByRefType = Type_GetTypeFromSig(pMetaData, pSig, ppClassTypeArgs, ppMethodTypeArgs); + } + // fall-through + case ELEMENT_TYPE_INTPTR: + return types[TYPE_SYSTEM_INTPTR]; + + case ELEMENT_TYPE_VALUETYPE: + case ELEMENT_TYPE_CLASS: + entry = MetaData_DecodeSigEntryToken(pSig); + return MetaData_GetTypeDefFromDefRefOrSpec(pMetaData, entry, ppClassTypeArgs, ppMethodTypeArgs); + + case ELEMENT_TYPE_VAR: + entry = MetaData_DecodeSigEntry(pSig); // This is the argument number + if (ppClassTypeArgs == NULL) { + // Return null here as we don't yet know what the type really is. + // The generic instantiation code figures this out later. + return NULL; + } else { + return ppClassTypeArgs[entry]; + } + + case ELEMENT_TYPE_GENERICINST: + { + tMD_TypeDef *pType; + + pType = Generics_GetGenericTypeFromSig(pMetaData, pSig, ppClassTypeArgs, ppMethodTypeArgs); + return pType; + } + + //case ELEMENT_TYPE_INTPTR: + // return types[TYPE_SYSTEM_INTPTR]; + + case ELEMENT_TYPE_UINTPTR: + return types[TYPE_SYSTEM_UINTPTR]; + + case ELEMENT_TYPE_OBJECT: + return types[TYPE_SYSTEM_OBJECT]; + + case ELEMENT_TYPE_SZARRAY: + { + tMD_TypeDef *pElementType; + + pElementType = Type_GetTypeFromSig(pMetaData, pSig, ppClassTypeArgs, ppMethodTypeArgs); + return Type_GetArrayTypeDef(pElementType, ppClassTypeArgs, ppMethodTypeArgs); + } + + case ELEMENT_TYPE_MVAR: + entry = MetaData_DecodeSigEntry(pSig); // This is the argument number + if (ppMethodTypeArgs == NULL) { + // Can't do anything sensible, as we don't have any type args + return NULL; + } else { + return ppMethodTypeArgs[entry]; + } + + default: + Crash("Type_GetTypeFromSig(): Cannot handle signature element type: 0x%02x", entry); + FAKE_RETURN; + } +} + +tMD_TypeDef **types; +static U32 numInitTypes; + +typedef struct tTypeInit_ tTypeInit; +struct tTypeInit_ { + char *assemblyName; + char *nameSpace; + char *name; + U8 stackType; + U8 stackSize; + U8 arrayElementSize; + U8 instanceMemSize; +}; + +static char mscorlib[] = "mscorlib"; +static char System[] = "System"; +static char SystemCollectionsGeneric[] = "System.Collections.Generic"; +static char SystemThreading[] = "System.Threading"; +static char SystemIO[] = "System.IO"; +static char SystemGlobalization[] = "System.Globalization"; + +static tTypeInit typeInit[] = { + {mscorlib, System, "Object", EVALSTACK_O, 4, 4, 0}, + {mscorlib, System, "Array", EVALSTACK_O, 4, 4, 0}, + {mscorlib, System, "Void", EVALSTACK_O, 4, 4, 0}, + {mscorlib, System, "Boolean", EVALSTACK_INT32, 4, 4, 4}, + {mscorlib, System, "Byte", EVALSTACK_INT32, 4, 1, 4}, + {mscorlib, System, "SByte", EVALSTACK_INT32, 4, 1, 4}, + {mscorlib, System, "Char", EVALSTACK_INT32, 4, 2, 4}, + {mscorlib, System, "Int16", EVALSTACK_INT32, 4, 2, 4}, + {mscorlib, System, "Int32", EVALSTACK_INT32, 4, 4, 4}, + {mscorlib, System, "String", EVALSTACK_O, 4, 4, 0}, + {mscorlib, System, "IntPtr", EVALSTACK_PTR, sizeof(void*), sizeof(void*), 0}, + {mscorlib, System, "RuntimeFieldHandle", EVALSTACK_O, 4, 4, 0}, + {mscorlib, System, "InvalidCastException", EVALSTACK_O, 0, 0, 0}, + {mscorlib, System, "UInt32", EVALSTACK_INT32, 4, 4, 4}, + {mscorlib, System, "UInt16", EVALSTACK_INT32, 4, 2, 4}, + {NULL, NULL, (char*)TYPE_SYSTEM_CHAR, 0, 0, 0, 0}, + {NULL, NULL, (char*)TYPE_SYSTEM_OBJECT, 0, 0, 0, 0}, + {mscorlib, SystemCollectionsGeneric, "IEnumerable`1", EVALSTACK_O, 4, 4, 0}, + {mscorlib, SystemCollectionsGeneric, "ICollection`1", EVALSTACK_O, 4, 4, 0}, + {mscorlib, SystemCollectionsGeneric, "IList`1", EVALSTACK_O, 4, 4, 0}, + {mscorlib, System, "MulticastDelegate", EVALSTACK_O, 0, 0, 0}, + {mscorlib, System, "NullReferenceException", EVALSTACK_O, 0, 0, 0}, + {mscorlib, System, "Single", EVALSTACK_F32, 4, 4, 4}, + {mscorlib, System, "Double", EVALSTACK_F64, 8, 8, 8}, + {mscorlib, System, "Int64", EVALSTACK_INT64, 8, 8, 8}, + {mscorlib, System, "UInt64", EVALSTACK_INT64, 8, 8, 8}, + {mscorlib, System, "RuntimeType", EVALSTACK_O, 4, 4, sizeof(tRuntimeType)}, + {mscorlib, System, "Type", EVALSTACK_O, 4, 4, 0}, + {mscorlib, System, "RuntimeTypeHandle", EVALSTACK_O, 4, 4, 0}, + {mscorlib, System, "RuntimeMethodHandle", EVALSTACK_O, 4, 4, 0}, + {mscorlib, System, "Enum", EVALSTACK_VALUETYPE, 0, 0, 0}, + {NULL, NULL, (char*)TYPE_SYSTEM_STRING, 0, 0, 0, 0}, + {NULL, NULL, (char*)TYPE_SYSTEM_INT32, 0, 0, 0, 0}, + {mscorlib, SystemThreading, "Thread", EVALSTACK_O, 4, 4, sizeof(tThread)}, + {mscorlib, SystemThreading, "ThreadStart", EVALSTACK_O, 0, 0, 0}, + {mscorlib, SystemThreading, "ParameterizedThreadStart", EVALSTACK_O, 0, 0, 0}, + {mscorlib, System, "WeakReference", EVALSTACK_O, 4, 4, 0}, + {mscorlib, SystemIO, "FileMode", EVALSTACK_O, 0, 0, 0}, + {mscorlib, SystemIO, "FileAccess", EVALSTACK_O, 0, 0, 0}, + {mscorlib, SystemIO, "FileShare", EVALSTACK_O, 0, 0, 0}, + {NULL, NULL, (char*)TYPE_SYSTEM_BYTE, 0, 0, 0, 0}, + {mscorlib, SystemGlobalization, "UnicodeCategory", EVALSTACK_INT32, 0, 0, 0}, + {mscorlib, System, "OverflowException", EVALSTACK_O, 0, 0, 0}, + {mscorlib, System, "PlatformID", EVALSTACK_INT32, 0, 0, 0}, + {mscorlib, SystemIO, "FileAttributes", EVALSTACK_O, 0, 0, 0}, + {mscorlib, System, "UIntPtr", EVALSTACK_PTR, sizeof(void*), sizeof(void*), 0}, + {mscorlib, System, "Nullable`1", EVALSTACK_VALUETYPE, 0, 0, 0}, + {NULL, NULL, (char*)TYPE_SYSTEM_TYPE, 0, 0, 0, 0}, +}; + +int CorLibDone = 0; + +void Type_Init() { + U32 i; + + // Build all the types needed by the interpreter. + numInitTypes = sizeof(typeInit) / sizeof(typeInit[0]); + types = (tMD_TypeDef**)mallocForever(numInitTypes * sizeof(tMD_TypeDef*)); + for (i=0; istackType = typeInit[i].stackType; + types[i]->stackSize = typeInit[i].stackSize; + types[i]->arrayElementSize = typeInit[i].arrayElementSize; + types[i]->instanceMemSize = typeInit[i].instanceMemSize; + } + } + for (i=0; i') { + // Generic instance method + if (strncmp(pMethod->name, name, nameLen - 1) != 0) { + return 0; + } + } else { + if (strcmp(pMethod->name, name) != 0) { + return 0; + } + } + + sig = MetaData_GetBlob(pMethod->signature, &sigLen); + i = MetaData_DecodeSigEntry(&sig); // Don't care about this + if (i & SIG_METHODDEF_GENERIC) { + MetaData_DecodeSigEntry(&sig); + } + numSigParams = MetaData_DecodeSigEntry(&sig); + + if (numParams != numSigParams) { + return 0; + } + + if (pReturnType == types[TYPE_SYSTEM_VOID]) { + pReturnType = NULL; + } + + for (i=0; ipMetaData, &sig, NULL, NULL); + pParamType = (i == 0)?pReturnType:types[pParamTypeIndexs[i-1]]; + + if (pSigType != NULL && TYPE_ISARRAY(pSigType) && pParamType == types[TYPE_SYSTEM_ARRAY_NO_TYPE]) { + // It's ok... + } else { + if (pSigType != pParamType) { + goto endBad; + } + } + } + return 1; + +endBad: + return 0; +} + +U32 Type_IsDerivedFromOrSame(tMD_TypeDef *pBaseType, tMD_TypeDef *pTestType) { + while (pTestType != NULL) { + if (pTestType == pBaseType) { + return 1; + } + MetaData_Fill_TypeDef(pTestType, NULL, NULL); + pTestType = pTestType->pParent; + } + return 0; +} + +U32 Type_IsImplemented(tMD_TypeDef *pInterface, tMD_TypeDef *pTestType) { + U32 i; + + for (i=0; inumInterfaces; i++) { + if (pTestType->pInterfaceMaps[i].pInterface == pInterface) { + return 1; + } + } + return 0; +} + +U32 Type_IsAssignableFrom(tMD_TypeDef *pToType, tMD_TypeDef *pFromType) { + return + Type_IsDerivedFromOrSame(pToType, pFromType) || + (TYPE_ISINTERFACE(pToType) && Type_IsImplemented(pToType, pFromType)); +} + +HEAP_PTR Type_GetTypeObject(tMD_TypeDef *pTypeDef) { + if (pTypeDef->typeObject == NULL) { + pTypeDef->typeObject = RuntimeType_New(pTypeDef); + } + return pTypeDef->typeObject; +} \ No newline at end of file diff --git a/dna/Type.h b/dna/Type.h new file mode 100644 index 0000000..dba8740 --- /dev/null +++ b/dna/Type.h @@ -0,0 +1,127 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__TYPE_H) +#define __TYPE_H + +#include "MetaData.h" +#include "Types.h" + +#define ELEMENT_TYPE_VOID 0x01 +#define ELEMENT_TYPE_BOOLEAN 0x02 +#define ELEMENT_TYPE_CHAR 0x03 +#define ELEMENT_TYPE_I1 0x04 +#define ELEMENT_TYPE_U1 0x05 +#define ELEMENT_TYPE_I2 0x06 +#define ELEMENT_TYPE_U2 0x07 +#define ELEMENT_TYPE_I4 0x08 +#define ELEMENT_TYPE_U4 0x09 +#define ELEMENT_TYPE_I8 0x0a +#define ELEMENT_TYPE_U8 0x0b +#define ELEMENT_TYPE_R4 0x0c +#define ELEMENT_TYPE_R8 0x0d +#define ELEMENT_TYPE_STRING 0x0e +#define ELEMENT_TYPE_PTR 0x0f +#define ELEMENT_TYPE_BYREF 0x10 +#define ELEMENT_TYPE_VALUETYPE 0x11 +#define ELEMENT_TYPE_CLASS 0x12 +#define ELEMENT_TYPE_VAR 0x13 // Generic argument type + +#define ELEMENT_TYPE_GENERICINST 0x15 + +#define ELEMENT_TYPE_INTPTR 0x18 +#define ELEMENT_TYPE_UINTPTR 0x19 + +#define ELEMENT_TYPE_OBJECT 0x1c +#define ELEMENT_TYPE_SZARRAY 0x1d +#define ELEMENT_TYPE_MVAR 0x1e + + +extern tMD_TypeDef **types; +#define TYPE_SYSTEM_OBJECT 0 +#define TYPE_SYSTEM_ARRAY_NO_TYPE 1 +#define TYPE_SYSTEM_VOID 2 +#define TYPE_SYSTEM_BOOLEAN 3 +#define TYPE_SYSTEM_BYTE 4 +#define TYPE_SYSTEM_SBYTE 5 +#define TYPE_SYSTEM_CHAR 6 +#define TYPE_SYSTEM_INT16 7 +#define TYPE_SYSTEM_INT32 8 +#define TYPE_SYSTEM_STRING 9 +#define TYPE_SYSTEM_INTPTR 10 +#define TYPE_SYSTEM_RUNTIMEFIELDHANDLE 11 +#define TYPE_SYSTEM_INVALIDCASTEXCEPTION 12 +#define TYPE_SYSTEM_UINT32 13 +#define TYPE_SYSTEM_UINT16 14 +#define TYPE_SYSTEM_ARRAY_CHAR 15 +#define TYPE_SYSTEM_ARRAY_OBJECT 16 +#define TYPE_SYSTEM_COLLECTIONS_GENERIC_IENUMERABLE_T 17 +#define TYPE_SYSTEM_COLLECTIONS_GENERIC_ICOLLECTION_T 18 +#define TYPE_SYSTEM_COLLECTIONS_GENERIC_ILIST_T 19 +#define TYPE_SYSTEM_MULTICASTDELEGATE 20 +#define TYPE_SYSTEM_NULLREFERENCEEXCEPTION 21 +#define TYPE_SYSTEM_SINGLE 22 +#define TYPE_SYSTEM_DOUBLE 23 +#define TYPE_SYSTEM_INT64 24 +#define TYPE_SYSTEM_UINT64 25 +#define TYPE_SYSTEM_RUNTIMETYPE 26 +#define TYPE_SYSTEM_TYPE 27 +#define TYPE_SYSTEM_RUNTIMETYPEHANDLE 28 +#define TYPE_SYSTEM_RUNTIMEMETHODHANDLE 29 +#define TYPE_SYSTEM_ENUM 30 +#define TYPE_SYSTEM_ARRAY_STRING 31 +#define TYPE_SYSTEM_ARRAY_INT32 32 +#define TYPE_SYSTEM_THREADING_THREAD 33 +#define TYPE_SYSTEM_THREADING_THREADSTART 34 +#define TYPE_SYSTEM_THREADING_PARAMETERIZEDTHREADSTART 35 +#define TYPE_SYSTEM_WEAKREFERENCE 36 +#define TYPE_SYSTEM_IO_FILEMODE 37 +#define TYPE_SYSTEM_IO_FILEACCESS 38 +#define TYPE_SYSTEM_IO_FILESHARE 39 +#define TYPE_SYSTEM_ARRAY_BYTE 40 +#define TYPE_SYSTEM_GLOBALIZATION_UNICODECATEGORY 41 +#define TYPE_SYSTEM_OVERFLOWEXCEPTION 42 +#define TYPE_SYSTEM_PLATFORMID 43 +#define TYPE_SYSTEM_IO_FILESYSTEMATTRIBUTES 44 +#define TYPE_SYSTEM_UINTPTR 45 +#define TYPE_SYSTEM_NULLABLE 46 +#define TYPE_SYSTEM_ARRAY_TYPE 47 + +//U32 Type_IsMethod(tMD_MethodDef *pMethod, STRING name, tMD_TypeDef *pReturnType, U32 numParams, ...); +U32 Type_IsMethod(tMD_MethodDef *pMethod, STRING name, tMD_TypeDef *pReturnType, U32 numParams, U8 *pParamTypeIndexs); + +void Type_Init(); + +U32 Type_IsValueType(tMD_TypeDef *pTypeDef); + +tMD_TypeDef* Type_GetTypeFromSig(tMetaData *pMetaData, SIG *pSig, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs); + +// Is TestType derived from BaseType or the same as BaseType? +U32 Type_IsDerivedFromOrSame(tMD_TypeDef *pBaseType, tMD_TypeDef *pTestType); +// Does TestType implement pInterface? +U32 Type_IsImplemented(tMD_TypeDef *pInterface, tMD_TypeDef *pTestType); +// Can a variable of FromType be assigend to ToType? +U32 Type_IsAssignableFrom(tMD_TypeDef *pToType, tMD_TypeDef *pFromType); + +tMD_TypeDef* Type_GetArrayTypeDef(tMD_TypeDef *pElementType, tMD_TypeDef **ppClassTypeArgs, tMD_TypeDef **ppMethodTypeArgs); + +HEAP_PTR Type_GetTypeObject(tMD_TypeDef *pTypeDef); + +#endif \ No newline at end of file diff --git a/dna/Types.h b/dna/Types.h new file mode 100644 index 0000000..fd34a9a --- /dev/null +++ b/dna/Types.h @@ -0,0 +1,96 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#if !defined(__TYPES_H) +#define __TYPES_H + +// Indexes into the user-string heap +typedef unsigned int IDX_USERSTRINGS; + +// Index into a table. most significant byte stores which table, other 3 bytes store index +typedef unsigned int IDX_TABLE; + +// Flag types +typedef unsigned int FLAGS32; +typedef unsigned short FLAGS16; + +// Pointers +typedef unsigned char* HEAP_PTR; +typedef unsigned char* PTR; +typedef unsigned char* SIG; +typedef unsigned char* STRING; // UTF8/ASCII string +typedef unsigned short* STRING2; // UTF16 string +typedef unsigned char* BLOB_; +typedef unsigned char* GUID_; + +// Int types +typedef long long I64; +typedef unsigned long long U64; + +#ifdef WIN32 + +typedef int I32; +typedef unsigned int U32; +typedef short I16; +typedef unsigned short U16; +typedef char I8; +typedef unsigned char U8; + +#endif // WIN32 + +typedef union uConvDouble_ uConvDouble; +union uConvDouble_ { + double d; + U64 u64; + struct { + U32 a; + U32 b; + } u32; +}; + +typedef union uConvFloat_ uConvFloat; +union uConvFloat_ { + float f; + U32 u32; +}; + +// other types! +typedef unsigned short CHAR2; + +typedef struct tAsyncCall_ tAsyncCall; + +// Native function call +typedef tAsyncCall* (*fnInternalCall)(PTR pThis_, PTR pParams, PTR pReturnValue); +// Native function call check routine for blocking IO +typedef U32 (*fnInternalCallCheck)(PTR pThis_, PTR pParams, PTR pReturnValue, tAsyncCall *pAsync); + +struct tAsyncCall_ { + // If this is a sleep call, then put the sleep time in ms here. + // -1 means it's not a sleep call. Inifite timeouts are not allowed. + I32 sleepTime; + // If this is a blocking IO call, then this is the function to poll to see if the result is available. + fnInternalCallCheck checkFn; + // A state pointer for general use for blocking IO calls. + PTR state; + // Not for most functions to use. Record the start time of this async call + U64 startTime; +}; + +#endif diff --git a/dna/dna.c b/dna/dna.c new file mode 100644 index 0000000..2c3e645 --- /dev/null +++ b/dna/dna.c @@ -0,0 +1,210 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "Compat.h" +#include "Sys.h" + +#include "CLIFile.h" +#include "MetaData.h" +#include "Type.h" +#include "Heap.h" +#include "Finalizer.h" +#include "System.Net.Sockets.Socket.h" +#include "MethodState.h" + +static void ShowUsage() { + printf("Usage:\n"); + printf("\tdna [-v] <.Net executable to execute> [.Net executable arguments]\n"); + printf("\n"); + printf("\t-v : Verbose output of files loaded and GC statistics\n"); + printf("\t-vv : More verbose output, including methods JITted and types/arrays/generics use\n"); + printf("\n"); + exit(1); +} + +int main(int argc, char **argp) { + tCLIFile *pCLIFile; + char *pFileName; + U32 i; + I32 retValue; +#ifdef DIAG_TOTAL_TIME + U64 startTime; +#endif + + if (argc < 2) { + ShowUsage(); + } + + // Read any flags passed in + for (i=1; i < (U32)argc; i++) { + if (argp[i][0] == '-') { + U32 j; + + for (j=1; ; j++) { + switch (argp[i][j]) { + case 0: + goto doneArgs; + case 'v': + logLevel++; + break; + default: + Crash("Invalid argument: -%c", argp[i][1]); + } + } +doneArgs:; + } else { + break; + } + } + + JIT_Execute_Init(); + MetaData_Init(); + Type_Init(); + Heap_Init(); + Finalizer_Init(); + Socket_Init(); + +#ifdef DIAG_OPCODE_TIMES +#ifdef WIN32 + { + HANDLE hProcess = GetCurrentProcess(); + SetProcessAffinityMask(hProcess, 1); + } +#endif + memset(opcodeTimes, 0, sizeof(opcodeTimes)); +#endif + +#ifdef DIAG_OPCODE_USE + memset(opcodeNumUses, 0, sizeof(opcodeNumUses)); +#endif + + pFileName = argp[i]; + + pCLIFile = CLIFile_Load(pFileName); + +#ifdef DIAG_TOTAL_TIME + startTime = microTime(); +#endif + + retValue = CLIFile_Execute(pCLIFile, argc - i, argp + i); + +#ifdef DIAG_TOTAL_TIME + printf("Total execution time = %d ms\n", (int)((microTime() - startTime) / 1000)); +#endif + +#ifdef DIAG_GC + printf("Total GC time = %d ms\n", (int)(gcTotalTime / 1000)); +#endif + +#ifdef DIAG_METHOD_CALLS + { + U32 numMethods, i; + I32 howMany = 25; + tMetaData *pCorLib; + // Report on most-used methods + pCorLib = CLIFile_GetMetaDataForAssembly("mscorlib"); + numMethods = pCorLib->tables.numRows[MD_TABLE_METHODDEF]; + printf("\nCorLib method usage:\n"); + for (; howMany > 0; howMany--) { + tMD_MethodDef *pMethod; + U32 maxCount = 0, maxIndex = 0; + for (i=1; i<=numMethods; i++) { + pMethod = (tMD_MethodDef*)MetaData_GetTableRow(pCorLib, MAKE_TABLE_INDEX(MD_TABLE_METHODDEF, i)); + if (pMethod->callCount > maxCount) { + maxCount = pMethod->callCount; + maxIndex = i; + } + } + pMethod = (tMD_MethodDef*)MetaData_GetTableRow(pCorLib, MAKE_TABLE_INDEX(MD_TABLE_METHODDEF, maxIndex)); + printf("%d: %s (%d)\n", (int)pMethod->callCount, Sys_GetMethodDesc(pMethod), (int)(pMethod->totalTime/1000)); + pMethod->callCount = 0; + } + printf("\n"); + } + { + U32 numMethods, i; + I32 howMany = 25; + tMetaData *pCorLib; + // Report on most-used methods + pCorLib = CLIFile_GetMetaDataForAssembly("mscorlib"); + numMethods = pCorLib->tables.numRows[MD_TABLE_METHODDEF]; + printf("\nCorLib method execution time:\n"); + for (; howMany > 0; howMany--) { + tMD_MethodDef *pMethod; + U64 maxTime = 0; + U32 maxIndex = 0; + for (i=1; i<=numMethods; i++) { + pMethod = (tMD_MethodDef*)MetaData_GetTableRow(pCorLib, MAKE_TABLE_INDEX(MD_TABLE_METHODDEF, i)); + if (pMethod->totalTime > maxTime) { + maxTime = pMethod->totalTime; + maxIndex = i; + } + } + pMethod = (tMD_MethodDef*)MetaData_GetTableRow(pCorLib, MAKE_TABLE_INDEX(MD_TABLE_METHODDEF, maxIndex)); + printf("%d: %s (%d)\n", (int)pMethod->callCount, Sys_GetMethodDesc(pMethod), (int)(pMethod->totalTime/1000)); + pMethod->totalTime = 0; + } + printf("\n"); + } +#endif +#ifdef DIAG_OPCODE_TIMES + { + I32 howMany = 25; + U32 i; + printf("\nOpCodes execution time:\n"); + for (; howMany > 0; howMany--) { + U64 maxTime = 0; + U32 maxIndex = 0; + for (i=0; i maxTime) { + maxTime = opcodeTimes[i]; + maxIndex = i; + } + } + printf("0x%03x: %dms (used %d times) (ave = %d)\n", + maxIndex, (int)(maxTime / 1000), (int)opcodeNumUses[maxIndex], (int)(maxTime / opcodeNumUses[maxIndex])); + opcodeTimes[maxIndex] = 0; + } + } +#endif +#ifdef DIAG_OPCODE_USE + { + I32 howMany = 25; + U32 i, j; + printf("\nOpcode use:\n"); + for (j=1; howMany>0; howMany--, j++) { + U32 maxUse = 0; + U32 maxIndex = 0; + for (i=0; i maxUse) { + maxUse = opcodeNumUses[i]; + maxIndex = i; + } + } + printf("%02d 0x%03x: %d\n", j, maxIndex, maxUse); + opcodeNumUses[maxIndex] = 0; + } + } +#endif + + //Crash("FINISHED!!!"); + + return retValue; +} diff --git a/dna/dna.vcproj b/dna/dna.vcproj new file mode 100644 index 0000000..30fddd7 --- /dev/null +++ b/dna/dna.vcproj @@ -0,0 +1,558 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libIGraph/Bitmap.c b/libIGraph/Bitmap.c new file mode 100644 index 0000000..2248a99 --- /dev/null +++ b/libIGraph/Bitmap.c @@ -0,0 +1,78 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "Bitmap.h" +#include "Graphics.h" + +tBitmap* CreateBitmap_(I32 width, I32 height, U32 pixelFormat) { + tBitmap *pBitmap; + U32 bitsPerPixel; + U32 memSize, stride; + U32 ok; + + switch (pixelFormat) { + case PixelFormat_Format32bppArgb: + bitsPerPixel = 32; + break; + case PixelFormat_Gdi: + bitsPerPixel = 4; + break; + default: + return NULL; + } + + // Ensure stride is always a multiple of 32 bits + stride = (width * bitsPerPixel + 31) & 0xffffffe0; + stride /= 8; + memSize = stride * height; + pBitmap = malloc(sizeof(tBitmap) + memSize); + + ok = InitImage(&pBitmap->image, IMAGE_TYPE_BITMAP, width, height, pixelFormat); + if (!ok) { + free(pBitmap); + return NULL; + } + + memset(pBitmap->pBmp, 0, memSize); + pBitmap->memSize = memSize; + pBitmap->stride = stride; + + return pBitmap; +} + +tGraphics* GetGraphicsFromBitmap_(tBitmap *pBitmap) { + tGraphics *pGraphics = InitGraphics(); + + pGraphics->memSize = pBitmap->memSize; + pGraphics->pImage = (tImage*)pBitmap; + pGraphics->pixelFormat = pBitmap->image.pixelFormat; + pGraphics->pixelFormatIndex = pBitmap->image.pixelFormatIndex; + pGraphics->pScan0 = pBitmap->pBmp; + pGraphics->screenPtr = NULL; + pGraphics->stride = pBitmap->stride; + pGraphics->textRenderingHint = TextRenderingHint_SystemDefault; + pGraphics->xSize = pBitmap->image.width; + pGraphics->ySize = pBitmap->image.height; + + return pGraphics; +} + diff --git a/libIGraph/Bitmap.h b/libIGraph/Bitmap.h new file mode 100644 index 0000000..ab924b4 --- /dev/null +++ b/libIGraph/Bitmap.h @@ -0,0 +1,40 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __BITMAP_H +#define __BITMAP_H + +#include "libIGraph.h" + +#include "Image.h" + +typedef struct tBitmap_ tBitmap; +struct tBitmap_ { + tImage image; + U32 memSize; + U32 stride; + U8 pBmp[0]; +}; + +tBitmap* CreateBitmap_(I32 width, I32 height, U32 pixelFormat); +tGraphics* GetGraphicsFromBitmap_(tBitmap *pBitmap); +tBitmap* BitmapFromFile_(STRING filename, I32 *pWidth, I32 *pHeight, U32 *pPixelFormat); + +#endif diff --git a/libIGraph/BitmapLoader.c b/libIGraph/BitmapLoader.c new file mode 100644 index 0000000..2afba4e --- /dev/null +++ b/libIGraph/BitmapLoader.c @@ -0,0 +1,656 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "Bitmap.h" + +#include "tinyjpeg.h" + +typedef struct tBitmapFileHeader_ tBitmapFileHeader; +struct tBitmapFileHeader_ { + U16 bfType; + U32 bfSize; + U16 bfReserved1; + U16 bfReserved2; + U32 bfOffBits; +}; + +typedef struct tBitmapInfoHeader_ tBitmapInfoHeader; +struct tBitmapInfoHeader_ { + U32 biSize; + I32 biWidth; + I32 biHeight; + U16 biPlanes; + U16 biBitCount; + U32 biCompression; + U32 biSizeImage; + I32 biXPelsPerMetre; + I32 biYPelsPerMetre; + U32 biClrUsed; + U32 biClrImportant; +}; + +typedef struct tRGBQuad_ tRGBQuad; +struct tRGBQuad_ { + U8 blue; + U8 green; + U8 red; + U8 unused; +}; + +#define BI_RGB 0L +#define BI_RLE8 1L +#define BI_RLE4 2L + +tBitmap* LoadBMP(U8 *pFile, I32 *pWidth, I32 *pHeight, U32 *pPixelFormat) { + tBitmapInfoHeader bih; + tBitmap *pBmp; + U8 u8; + U32 x, y, r, g, b, col, col2; + U32 width, height; + U32 linePadding; + U8 *pFilePicMem; + U32 *pBmpMem; + U32 i; + tRGBQuad *pColTable; + + // Need to do it this way as the data is not 32-bit aligned in file :( + memcpy(&bih, pFile + 14, sizeof(tBitmapInfoHeader)); + if (bih.biSize != 40) { + // Only handle BMP v3 files + return NULL; + } + + pBmp = CreateBitmap_(bih.biWidth, bih.biHeight, PixelFormat_Format32bppArgb); + *pWidth = width = pBmp->image.width; + *pHeight = height = pBmp->image.height; + *pPixelFormat = pBmp->image.pixelFormat; + pBmpMem = (U32*)(pBmp->pBmp + (bih.biHeight-1) * pBmp->stride); + pFilePicMem = pFile + 14 + sizeof(tBitmapInfoHeader); + + switch (bih.biBitCount) { + case 4: + pColTable = (tRGBQuad*)pFilePicMem; + pFilePicMem += 16 * 4; + break; + case 8: + pColTable = (tRGBQuad*)pFilePicMem; + pFilePicMem += 256 * 4; + break; + } + + linePadding = (32 - ((((bih.biBitCount * bih.biWidth) & 0x1f)) >> 3)) & 0x3; + + switch (bih.biBitCount) { + case 4: + switch (bih.biCompression) { + case BI_RGB: + for (y=0; y>1); x++) { + col2 = *pFilePicMem++; + col = col2 >> 4; + r = pColTable[col].red; + g = pColTable[col].green; + b = pColTable[col].blue; + col = ARGB(255, r, g, b); + *pBmpMem++ = col; + col = col2 & 0xf; + r = pColTable[col].red; + g = pColTable[col].green; + b = pColTable[col].blue; + col = ARGB(255, r, g, b); + *pBmpMem++ = col; + } + if (width & 1) { + col2 = *pFilePicMem++; + col = col2 >> 4; + r = pColTable[col].red; + g = pColTable[col].green; + b = pColTable[col].blue; + col = ARGB(255, r, g, b); + *pBmpMem++ = col; + } + pBmpMem -= pBmp->stride >> 1; + pFilePicMem += linePadding; + } + break; + case BI_RLE4: + x = y = 0; + for (;;) { + u8 = *pFilePicMem++; + if (u8 == 0) { + u8 = *pFilePicMem++; + switch (u8) { + case 0: // End of line + y++; + if (y > (U32)bih.biHeight) { + goto doneBad; + } + for (; x < (U32)bih.biWidth; x++) { + *pBmpMem++ = ARGB(255,0,0,0); + } + x = 0; + pBmpMem -= pBmp->stride >> 1; + break; + case 1: // End of bitmap + goto doneGood; + case 2: // Delta - can only handle horizontal deltas + u8 = *pFilePicMem++; + if (*pFilePicMem++ != 0) { + goto doneBad; + } + for (i=u8 - 1; i>0; i--) { + *pBmpMem++ = ARGB(255,0,0,0); + x++; + } + break; + default: // absolute mode + x += u8; + if (x > (U32)bih.biWidth) { + // Problem with bitmap file - too many pixels in row + goto doneBad; + } + for (i=u8 >> 1; i>0; i--) { + col2 = *pFilePicMem++; + col = col2 >> 4; + r = pColTable[col].red; + g = pColTable[col].green; + b = pColTable[col].blue; + col = ARGB(255, r, b, g); + *pBmpMem++ = col; + col = col2 & 0x0f; + r = pColTable[col].red; + g = pColTable[col].green; + b = pColTable[col].blue; + col = ARGB(255, r, b, g); + *pBmpMem++ = col; + } + if (u8 & 1) { + col = *pFilePicMem++; + col >>= 4; + r = pColTable[col].red; + g = pColTable[col].green; + b = pColTable[col].blue; + col = ARGB(255, r, b, g); + *pBmpMem++ = col; + } + if ((u8 & 0x3) == 1 || (u8 & 0x3) == 2) { + pFilePicMem++; + } + break; + } + } else { + x += u8; + if (x > (U32)bih.biWidth) { + // Problem with bitmap file - too many pixels in row + goto doneBad; + } + col2 = *pFilePicMem++; + col = col2 >> 4; + r = pColTable[col].red; + g = pColTable[col].green; + b = pColTable[col].blue; + col = ARGB(255, r, g, b); + col2 &= 0x0f; + r = pColTable[col2].red; + g = pColTable[col2].green; + b = pColTable[col2].blue; + col2 = ARGB(255, r, g, b); + for (i=u8 >> 1; i>0; i--) { + *pBmpMem++ = col; + *pBmpMem++ = col2; + } + if (u8 & 1) { + *pBmpMem++ = col; + } + } + } + break; + default: + goto doneBad; + } + break; + case 8: + switch (bih.biCompression) { + case BI_RGB: + for (y=0; ystride >> 1; + pFilePicMem += linePadding; + } + break; + case BI_RLE8: + x = y = 0; + for (;;) { + u8 = *pFilePicMem++; + if (u8 == 0) { + u8 = *pFilePicMem++; + switch (u8) { + case 0: // End of line + y++; + if (y > (U32)bih.biHeight) { + goto doneBad; + } + for (; x < (U32)bih.biWidth; x++) { + *pBmpMem++ = ARGB(255,0,0,0); + } + x = 0; + pBmpMem -= pBmp->stride >> 1; + break; + case 1: // End of bitmap + goto doneGood; + case 2: // Delta - can't handle these + goto doneBad; + default: // absolute mode + x += u8; + if (x > (U32)bih.biWidth) { + // Problem with bitmap file - too many pixels in row + goto doneBad; + } + for (i = u8; i>0; i--) { + col = *pFilePicMem++; + r = pColTable[col].red; + g = pColTable[col].green; + b = pColTable[col].blue; + col = ARGB(255, r, b, g); + *pBmpMem++ = col; + } + if (u8 & 1) { + pFilePicMem++; + } + break; + } + } else { + x += u8; + if (x > (U32)bih.biWidth) { + // Problem with bitmap file - too many pixels in row + goto doneBad; + } + col = *pFilePicMem++; + r = pColTable[col].red; + g = pColTable[col].green; + b = pColTable[col].blue; + col = ARGB(255, r, b, g); + for (i=u8; i>0; i--) { + *pBmpMem++ = col; + } + } + } + break; + default: + goto doneBad; + } + break; + case 24: + for (y=0; ystride >> 1; + pFilePicMem += linePadding; + } + break; + case 32: + for (y=0; ystride >> 1; + pFilePicMem += linePadding; + } + break; + default: +doneBad: + DisposeImage_((tImage*)pBmp); + return NULL; + } + +doneGood: + return pBmp; +} + +typedef struct tGifHeader_ tGifHeader; +struct tGifHeader_ { + unsigned char gif[3]; + unsigned char version[3]; +}; + +// This always follows directly after the GifHeader +typedef struct tGifLogicalScreenDescriptor_ tGifLogicalScreenDescriptor; +struct tGifLogicalScreenDescriptor_ { + U16 width; + U16 height; + U8 flags; + U8 transparentIndex; + U8 pixelAspectRatio; +}; +#define GIF_LSD_HAS_GLOBALCOLOURTABLE 0x80 +#define GIF_LSD_GLOBALCOLOURTABLE_SIZE_MASK 0x7 + +typedef struct tGifColourTableEntry_ tGifColourTableEntry; +struct tGifColourTableEntry_ { + U8 red; + U8 green; + U8 blue; +}; + +typedef struct tGifImageDescriptor_ tGifImageDescriptor; +struct tGifImageDescriptor_ { + U8 imageSeparator; + U8 xPos1, xPos2; + U8 yPos1, yPos2; + U8 width1, width2; + U8 height1, height2; + U8 flags; +}; +#define GIF_ID_HAS_LOCALCOLOURTABLE 0x80 +#define GIF_ID_IS_INTERLACED 0x40 + +typedef struct tGifDictEntry_ tGifDictEntry; +struct tGifDictEntry_ { + U16 prevIndex; + U16 suffix; +}; + +tBitmap* LoadGIF(U8 *pFile, I32 *pWidth, I32 *pHeight, U32 *pPixelFormat) { + tBitmap *pBmp; + U32 width, height; + U32 *pBmpMem; + tGifLogicalScreenDescriptor *pLSD; + U32 gctSize; + tGifColourTableEntry *pColTable; + tGifImageDescriptor *pImageDesc; + U32 isInterlaced; + U8 blockLen; + U8 *pFileBlock; + U32 bitsPerCode, codeMask; + U32 clearCode, endCode; + U32 curCode, curCodeBitCount; + tGifDictEntry *pDict = NULL; + U32 dictOfs; + U32 codeSize; + U32 i, w; + U32 x, y; + U16 *pLineRedirect = NULL; + + pLSD = (tGifLogicalScreenDescriptor*)(pFile + sizeof(tGifHeader)); + if (!(pLSD->flags & GIF_LSD_HAS_GLOBALCOLOURTABLE)) { + // Can only decode GIF's with global colour table + return NULL; + } + + pBmp = CreateBitmap_(pLSD->width, pLSD->height, PixelFormat_Format32bppArgb); + *pWidth = width = pBmp->image.width; + *pHeight = height = pBmp->image.height; + *pPixelFormat = pBmp->image.pixelFormat; + pBmpMem = (U32*)(pBmp->pBmp); + gctSize = 1 << ((pLSD->flags & GIF_LSD_GLOBALCOLOURTABLE_SIZE_MASK) + 1); + pColTable = (tGifColourTableEntry*)(((U8*)pLSD) + 7); + + pImageDesc = (tGifImageDescriptor*)(pColTable + gctSize); + if (pImageDesc->imageSeparator != 0x2c || + pImageDesc->xPos1 != 0 || pImageDesc->xPos2 != 0 || + pImageDesc->yPos1 != 0 || pImageDesc->yPos2 != 0 || + pImageDesc->width1 != (width & 0xff) || pImageDesc->width2 != (width >> 8) || + pImageDesc->height1 != (height & 0xff) || pImageDesc->height2 != (height >> 8) || + (pImageDesc->flags & GIF_ID_HAS_LOCALCOLOURTABLE)) { + goto doneBad; + } + isInterlaced = pImageDesc->flags & GIF_ID_IS_INTERLACED; + + pLineRedirect = (U16*)malloc(height << 1); + if (isInterlaced) { + static U8 passes[] = {3,0, 3,4, 2,2, 1,1}; + U32 pass = 0, iOfs = 0; + for (i=0; i= height) { + pass += 2; + iOfs = i; + goto reTarget; + } + pLineRedirect[i] = target; + } + } else { + for (i=0; i>= bitsPerCode; + curCodeBitCount -= bitsPerCode; + if (code == clearCode) { + dictOfs = endCode + 1; + bitsPerCode = codeSize + 1; + codeMask = (1 << bitsPerCode) - 1; + w = 0xffffffff; + } else if (code == endCode) { + goto doneGood; + } else { + U32 dontAddToDict = 0; + if (code > clearCode) { + if (code == dictOfs) { + // Special case - add to dictionary here, and don't later + dontAddToDict = 1; + pDict[dictOfs].prevIndex = w; + codeChain = w; + while (pDict[codeChain].prevIndex != 0xffff) { + codeChain = pDict[codeChain].prevIndex; + } + pDict[dictOfs].suffix = codeChain; + dictOfs++; + } else if (code > dictOfs){ + // Invalid code + goto doneGood; + } + } + // Put the data identifed by entry into the final bitmap + // Count how many pixels are about to be set + codeChain = code; + pixelCount=1; + while (pDict[codeChain].prevIndex != 0xffff) { + codeChain = pDict[codeChain].prevIndex; + pixelCount++; + } + codeChain0 = codeChain; + // Fill up the pixels + codeChain = code; + for (i = pixelCount; i > 0; i--) { + // TODO: Optimize!!! This is horribly inefficient. + tGifColourTableEntry *pCol = &pColTable[pDict[codeChain].suffix]; + U32 col = ARGB(255, pCol->red, pCol->green, pCol->blue); + U32 xLocal = x + i - 1; + U32 yLocal = y + xLocal / width; + xLocal %= width; + *(pBmpMem + pLineRedirect[yLocal] * width + xLocal) = col; + codeChain = pDict[codeChain].prevIndex; + } + + x += pixelCount; + y += x / width; + x %= width; + if (y >= height && x > 0) { + goto doneBad; + } + + if (w != 0xffffffff && !dontAddToDict && dictOfs < 0x1000) { + pDict[dictOfs].prevIndex = w; + pDict[dictOfs].suffix = codeChain0; + dictOfs++; + } + w = code; + if (dictOfs > codeMask) { + bitsPerCode++; + codeMask = (1 << bitsPerCode) - 1; + } + } + } +blockDone:; + } + +doneGood: + free(pDict); + return pBmp; + +doneBad: + free(pDict); + DisposeImage_((tImage*)pBmp); + return NULL; +} + +tBitmap* LoadJPEG(U8 *pFile, U32 fileSize, I32 *pWidth, I32 *pHeight, U32 *pPixelFormat) { + struct jdec_private *pJpegDecoder; + int res; + U32 width, height; + U8 *pRGB; + tBitmap *pBmp; + U32 i; + U32 *pBmpMem; + + pJpegDecoder = tinyjpeg_init(); + if (pJpegDecoder == NULL) { + return NULL; + } + res = tinyjpeg_parse_header(pJpegDecoder, pFile, fileSize); + if (res < 0) { + tinyjpeg_free(pJpegDecoder); + return NULL; + } + tinyjpeg_get_size(pJpegDecoder, (unsigned int*)&width, (unsigned int*)&height); + *pWidth = (I32)width; + *pHeight = (I32)height; + *pPixelFormat = PixelFormat_Format32bppArgb; + res = tinyjpeg_decode(pJpegDecoder, TINYJPEG_FMT_RGB24); + if (res < 0) { + tinyjpeg_free(pJpegDecoder); + return NULL; + } + tinyjpeg_get_components(pJpegDecoder, &pRGB); + + pBmp = CreateBitmap_(width, height, PixelFormat_Format32bppArgb); + pBmpMem = (U32*)(pBmp->pBmp); + for (i = width*height; i>0; i--) { + *pBmpMem++ = ARGB(255, pRGB[0], pRGB[1], pRGB[2]); + pRGB += 3; + } + + tinyjpeg_free(pJpegDecoder); + + return pBmp; +} + +tBitmap* BitmapFromFile_(STRING filename, I32 *pWidth, I32 *pHeight, U32 *pPixelFormat) { + + U8 *pFile; + U32 fileSize; + tBitmap *pBmp; + + { + U32 bytesRead; + int f; + f = open(filename, O_BINARY | O_RDONLY); + if (f < 0) { + return NULL; + } + fileSize = (U32)lseek(f, 0, SEEK_END); + lseek(f, 0, SEEK_SET); + pFile = (U8*)malloc(fileSize); + bytesRead = read(f, pFile, fileSize); + close(f); + if (bytesRead != fileSize) { + free(pFile); + return NULL; + } + } + + pBmp = NULL; + // See what kind of file this is + if (pFile[0] == 'B' && pFile[1] == 'M') { + // It's a bmp file + printf("BMP\n"); + pBmp = LoadBMP(pFile, pWidth, pHeight, pPixelFormat); + printf("1\n"); + } + else + if (pFile[0] == 'G' && pFile[1] == 'I' && pFile[2] == 'F') { + // It's a GIF file + pBmp = LoadGIF(pFile, pWidth, pHeight, pPixelFormat); + } + else + if (pFile[0] == 0xff && pFile[1] == 0xd8) { + // It's a JPEG file + pBmp = LoadJPEG(pFile, fileSize, pWidth, pHeight, pPixelFormat); + } + printf("2\n"); + + free(pFile); + printf("3\n"); + + return pBmp; +} diff --git a/libIGraph/Brush.c b/libIGraph/Brush.c new file mode 100644 index 0000000..cc5a055 --- /dev/null +++ b/libIGraph/Brush.c @@ -0,0 +1,148 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "Brush.h" + +#include "HatchBrushDefs.h" + +#include + +#define WrapMode_Tile 0 +#define WrapMode_TileFlipX 1 +#define WrapMode_TileFlipY 2 +#define WrapMode_TileFlipXY 3 +#define WrapMode_Clamp 4 + +tBrush* CreateBrush_Solid_(U32 argb) { + tSolidBrush *pBrush = TMALLOC(tSolidBrush); + + pBrush->root.brushType = BRUSHTYPE_SOLID; + pBrush->col = argb; + + return (tBrush*)pBrush; +} + +tBrush* CreateBrush_Hatch_(U32 hatchStyle, U32 foreCol, U32 backCol) { + tHatchBrush *pBrush = TMALLOC(tHatchBrush); + + pBrush->root.brushType = BRUSHTYPE_HATCH; + pBrush->pHatchDef = hatchDefs[hatchStyle]; + pBrush->foreCol = foreCol; + pBrush->backCol = backCol; + + return (tBrush*)pBrush; +} + +// See http://www.osix.net/modules/article/?id=770 +// Approx. solution - average error ~0.005% +I32 CalcLen(I32 x, I32 y) { + I32 a, b; + x = abs(x); + y = abs(y); + if (x > y) { + a = x; b = y; + } else { + b = x; a = y; + } + // 106 = (sqrt(2) - 1) << 8 + a = (a << 8) + (106 * b * b) / a; + a = ((a >> 8) + ((x*x + y*y) / (a >> 8))) >> 1; + return a; +} + +#define LG_BRUSH_ANGLE_PRECISION_BITS 10 + +tBrush* CreateBrush_LinearGradient_(I32 x1, I32 y1, I32 x2, I32 y2, U32 col1, U32 col2) { + I32 x, y; + I32 hyp; + tLinearGradientBrush *pBrush = TMALLOC(tLinearGradientBrush); + + pBrush->root.brushType = BRUSHTYPE_LINEARGRADIENT; + pBrush->wrapMode = WrapMode_Tile; + pBrush->x1 = x1; + pBrush->y1 = y1; + pBrush->x2 = x2; + pBrush->y2 = y2; + pBrush->col1 = col1; + pBrush->col2 = col2; + + x = x2 - x1; + y = y2 - y1; + hyp = CalcLen(x, y); + // cos angle + pBrush->rotVec00 = (x << LG_BRUSH_ANGLE_PRECISION_BITS) / hyp; + // sin angle + pBrush->rotVec10 = (y << LG_BRUSH_ANGLE_PRECISION_BITS) / hyp; + // grad length + pBrush->gradLength = hyp; + + return (tBrush*)pBrush; +} + +void DisposeBrush_(tBrush *pBrush) { + free(pBrush); +} + +static U32 Brush_GetPixelCol_Solid(tBrush *pBrush, tGraphics *pGraphics, I32 x, I32 y) { + return ((tSolidBrush*)pBrush)->col; +} + + +static U32 Brush_GetPixelCol_Hatch(tBrush *pBrush, tGraphics *pGraphics, I32 x, I32 y) { + U8 bits = ((tHatchBrush*)pBrush)->pHatchDef[y & 0x7]; + return (bits & (1 << (x & 0x7)))?((tHatchBrush*)pBrush)->foreCol:((tHatchBrush*)pBrush)->backCol; +} + +#define LG(pBrush) ((tLinearGradientBrush*)pBrush) +static U32 Brush_GetPixelCol_LinearGradient(tBrush *pBrush, tGraphics *pGraphics, I32 x, I32 y) { + I32 xr; + I32 gradLength; + U32 col1, col2; + U32 a, r, g, b; + + gradLength = LG(pBrush)->gradLength; + // Rotate just the x parameter around point 1 + xr = LG(pBrush)->rotVec00 * (x - LG(pBrush)->x1) + LG(pBrush)->rotVec10 * (y - LG(pBrush)->y1); + xr >>= LG_BRUSH_ANGLE_PRECISION_BITS; + xr %= gradLength; + if (xr < 0) { + xr += gradLength; + } + + col1 = LG(pBrush)->col1; + col2 = LG(pBrush)->col2; + + r = ((I32)R(col1)) + (((((I32)R(col2)) - ((I32)R(col1))) * xr) / gradLength); + g = ((I32)G(col1)) + (((((I32)G(col2)) - ((I32)G(col1))) * xr) / gradLength); + b = ((I32)B(col1)) + (((((I32)B(col2)) - ((I32)B(col1))) * xr) / gradLength); + a = ((I32)A(col1)) + (((((I32)A(col2)) - ((I32)A(col1))) * xr) / gradLength); + + return ARGB(a,r,g,b); +} +#undef LG + +tBrush_GetPixelCol mBrush_GetPixelCol_[BRUSHTYPE_NUM] = { + Brush_GetPixelCol_Solid, + Brush_GetPixelCol_Hatch, + Brush_GetPixelCol_LinearGradient +}; + diff --git a/libIGraph/Brush.h b/libIGraph/Brush.h new file mode 100644 index 0000000..1aef5cd --- /dev/null +++ b/libIGraph/Brush.h @@ -0,0 +1,74 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __BRUSH_H +#define __BRUSH_H + +#include "libIGraph.h" + +#include "Graphics.h" + +#define BRUSHTYPE_NUM 3 + +#define BRUSHTYPE_SOLID 0 +#define BRUSHTYPE_HATCH 1 +#define BRUSHTYPE_LINEARGRADIENT 2 + +typedef struct tBrush_ tBrush; +struct tBrush_ { + U32 brushType; +}; + +typedef struct tSolidBrush_ tSolidBrush; +struct tSolidBrush_ { + tBrush root; + U32 col; +}; + +typedef struct tHatchBrush_ tHatchBrush; +struct tHatchBrush_ { + tBrush root; + U32 foreCol, backCol; + U8 *pHatchDef; +}; + +typedef struct tLinearGradientBrush_ tLinearGradientBrush; +struct tLinearGradientBrush_ { + tBrush root; + U32 wrapMode; + I32 x1, y1; + I32 x2, y2; + U32 col1, col2; + // Pre-calculated rotation matrix to rotate all incoming points by + I32 rotVec00, rotVec10; + // Pre-calulated gradient length of one traverse from point1 to point2 + I32 gradLength; +}; + +tBrush* CreateBrush_Solid_(U32 argb); +tBrush* CreateBrush_Hatch_(U32 hatchStyle, U32 foreCol, U32 backCol); +tBrush* CreateBrush_LinearGradient_(I32 x1, I32 y1, I32 x2, I32 y2, U32 col1, U32 col2); +void DisposeBrush_(tBrush *pBrush); + +typedef U32 (*tBrush_GetPixelCol)(tBrush *pBrush, tGraphics *pGraphics, I32 x, I32 y); +extern tBrush_GetPixelCol mBrush_GetPixelCol_[BRUSHTYPE_NUM]; +#define mBrush_GetPixelCol(pBrush, pGraphics, x, y) mBrush_GetPixelCol_[(pBrush)->brushType](pBrush, pGraphics, x, y) + +#endif diff --git a/libIGraph/Config.h b/libIGraph/Config.h new file mode 100644 index 0000000..d3aa6f7 --- /dev/null +++ b/libIGraph/Config.h @@ -0,0 +1,36 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __CONFIG_H +#define __CONFIG_H + +// Include code to use the freetype library to display text +#define INCLUDE_FREETYPE + +// Include code to be able to load BMP image files +#define INCLUDE_IMAGE_BMP + +// Include code to be able to load GIF image files +#define INCLUDE_IMAGE_GIF + +// Include code to be able to load JPEG image files +#define INCLUDE_IMAGE_JPEG + +#endif diff --git a/libIGraph/DrawEllipses.c b/libIGraph/DrawEllipses.c new file mode 100644 index 0000000..a1fb626 --- /dev/null +++ b/libIGraph/DrawEllipses.c @@ -0,0 +1,110 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "DrawEllipses.h" +#include "Pixels.h" + +typedef void (*tEllipsePoint)(I32 x, I32 y, I32 cx, I32 cy, tGraphics *pGraphics, void *pData); + +// See http://www.cs.drexel.edu/~david/Classes/CS430/Lectures/L-06_Circles.6.pdf for algorithm + +static void CalcPoints(I32 width, I32 height, tEllipsePoint cb, I32 cx, I32 cy, tGraphics *pGraphics, void *pData, U32 isFill) { + I32 rx = width >> 1; + I32 ry = height >> 1; + I32 rx2 = rx * rx; + I32 ry2 = ry * ry; + I32 x, y, d; + + d = ry2 - rx2 * ry + rx2; + x = 0; + y = ry; + + for (; ry2 * x < rx2 * y; x++) { + if (d < 0) { + d += ry2 * (2 * x + 3); + if (!isFill) { + cb(x, y, cx, cy, pGraphics, pData); + } + } else { + d += ry2 * (2 * x + 3) - rx2 * (2 * y + 2); + cb(x, y, cx, cy, pGraphics, pData); + y--; + } + } + + d = ry2 * (x * x + x) + rx2 * (y - 1) * (y - 1) - rx2 * ry2; + for (; y >= 0; y--) { + cb(x, y, cx, cy, pGraphics, pData); + if (d < 0) { + d += ry2 * (2 * x + 2) - rx2 * (2 * y + 3); + x++; + } else { + d -= rx2 * (2 * y + 3); + } + } +} + +static void DrawEllipse_All_CB(I32 x, I32 y, I32 cx, I32 cy, tGraphics *pGraphics, void *pData) { + mSetPixel(pGraphics, cx - x, cy - y, ((tPen*)pData)->col); + if (x != 0) { + mSetPixel(pGraphics, cx + x, cy - y, ((tPen*)pData)->col); + } + if (y != 0) { + mSetPixel(pGraphics, cx - x, cy + y, ((tPen*)pData)->col); + if (x != 0) { + mSetPixel(pGraphics, cx + x, cy + y, ((tPen*)pData)->col); + } + } +} + +static void DrawEllipse_All(tGraphics *pGraphics, tPen *pPen, I32 x, I32 y, I32 width, I32 height) { + CalcPoints(width, height, DrawEllipse_All_CB, x + (width>>1), y + (height>>1), pGraphics, pPen, 0); +} + +tDrawEllipse mDrawEllipse_[FMT_NUM] = { + DrawEllipse_All, + DrawEllipse_All +}; + +static void FillEllipse_All_CB(I32 x, I32 y, I32 cx, I32 cy, tGraphics *pGraphics, void *pData) { + I32 i; + I32 y1 = cy - y; + I32 y2 = cy + y; + for (i=cx - x; i<= cx + x; i++) { + U32 col; + col = mBrush_GetPixelCol((tBrush*)pData, pGraphics, i, y1); + mSetPixel(pGraphics, i, y1, col); + if (y != 0) { + col = mBrush_GetPixelCol((tBrush*)pData, pGraphics, i, y2); + mSetPixel(pGraphics, i, y2, col); + } + } +} + +static void FillEllipse_All(tGraphics *pGraphics, tBrush *pBrush, I32 x, I32 y, I32 width, I32 height) { + CalcPoints(width, height, FillEllipse_All_CB, x + (width>>1), y + (height>>1), pGraphics, pBrush, 1); +} + +tFillEllipse mFillEllipse_[FMT_NUM] = { + FillEllipse_All, + FillEllipse_All +}; diff --git a/libIGraph/DrawEllipses.h b/libIGraph/DrawEllipses.h new file mode 100644 index 0000000..f108335 --- /dev/null +++ b/libIGraph/DrawEllipses.h @@ -0,0 +1,37 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __DRAWELLIPSES_H +#define __DRAWELLIPSES_H + +#include "libIGraph.h" +#include "Graphics.h" +#include "Pen.h" +#include "Brush.h" + +typedef void (*tDrawEllipse)(tGraphics *pGraphics, tPen *pPen, I32 x, I32 y, I32 width, I32 height); +extern tDrawEllipse mDrawEllipse_[FMT_NUM]; +#define mDrawEllipse(pGraphics, pPen, x, y, width, height) mDrawEllipse_[pGraphics->pixelFormatIndex](pGraphics, pPen, x, y, width, height) + +typedef void (*tFillEllipse)(tGraphics *pGraphics, tBrush *pBrush, I32 x, I32 y, I32 width, I32 height); +extern tFillEllipse mFillEllipse_[FMT_NUM]; +#define mFillEllipse(pGraphics, pBrush, x, y, width, height) mFillEllipse_[pGraphics->pixelFormatIndex](pGraphics, pBrush, x, y, width, height) + +#endif diff --git a/libIGraph/DrawLines.c b/libIGraph/DrawLines.c new file mode 100644 index 0000000..65e4381 --- /dev/null +++ b/libIGraph/DrawLines.c @@ -0,0 +1,81 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "DrawLines.h" +#include "Pixels.h" + +static void DrawLine_All(tGraphics *pGraphics, tPen *pPen, I32 x1, I32 y1, I32 x2, I32 y2) { + I32 dx = x2-x1; + I32 dy = y2-y1; + I32 overflow, absDx = ABS(dx), absDy = ABS(dy); + I32 x, y, inc; + U32 col = pPen->col; + + if (pPen->width <= 1.0f) { + // If pen size is 1 (or less) then use the fast algorithm for line drawing. + // Note that this still supports colour transparency. + if (absDx > absDy) { + // Scan along x-axis + if (dx < 0) { + SWAP_I32(x1, x2); + SWAP_I32(y1, y2); + } + y = y1; + inc = (y2>y1)?1:-1; + overflow = absDx >> 1; + for (x=x1; x<=x2; x++) { + mSetPixel(pGraphics, x, y, col); + overflow += absDy; + if (overflow >= absDx) { + overflow -= absDx; + y += inc; + } + } + } else { + // Scan along y-axis + if (dy < 0) { + SWAP_I32(x1, x2); + SWAP_I32(y1, y2); + } + x = x1; + inc = (x2>x1)?1:-1; + overflow = absDy >> 1; + for (y=y1; y<=y2; y++) { + mSetPixel(pGraphics, x, y, col); + overflow += absDx; + if (overflow >= absDy) { + overflow -= absDy; + x += inc; + } + } + } + } else { + // Use the 'fill-the-poly' algorithm for line drawing of thick lines. + + } +} + +tDrawLine mDrawLine_[FMT_NUM] = { + DrawLine_All, + DrawLine_All +}; + diff --git a/libIGraph/DrawLines.h b/libIGraph/DrawLines.h new file mode 100644 index 0000000..1999a92 --- /dev/null +++ b/libIGraph/DrawLines.h @@ -0,0 +1,32 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __DRAWLINES_H +#define __DRAWLINES_H + +#include "libIGraph.h" +#include "Graphics.h" +#include "Pen.h" + +typedef void (*tDrawLine)(tGraphics *pGraphics, tPen *pPen, I32 x1, I32 y1, I32 x2, I32 y2); +extern tDrawLine mDrawLine_[FMT_NUM]; +#define mDrawLine(pGraphics, pPen, x1, y1, x2, y2) mDrawLine_[pGraphics->pixelFormatIndex](pGraphics, pPen, x1, y1, x2, y2) + +#endif diff --git a/libIGraph/DrawRectangles.c b/libIGraph/DrawRectangles.c new file mode 100644 index 0000000..9a6a76e --- /dev/null +++ b/libIGraph/DrawRectangles.c @@ -0,0 +1,52 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "DrawRectangles.h" +#include "Pixels.h" + +static void FillRectangle_All(tGraphics *pGraphics, tBrush *pBrush, I32 x, I32 y, I32 width, I32 height) { + I32 x2, y2; + I32 xIt, yIt; + + x2 = x + width; + y2 = y + height; + + // Make sure that x,y is always top left, and x2,y2 is always bottom right + if (x > x2) { + SWAP_I32(x, x2); + } + if (y > y2) { + SWAP_I32(y, y2); + } + + for (yIt = y; yIt < y2; yIt++) { + for (xIt = x; xIt < x2; xIt++) { + U32 col = mBrush_GetPixelCol(pBrush, pGraphics, xIt, yIt); + mSetPixel(pGraphics, xIt, yIt, col); + } + } +} + +tFillRectangle mFillRectangle_[FMT_NUM] = { + FillRectangle_All, + FillRectangle_All +}; diff --git a/libIGraph/DrawRectangles.h b/libIGraph/DrawRectangles.h new file mode 100644 index 0000000..d652305 --- /dev/null +++ b/libIGraph/DrawRectangles.h @@ -0,0 +1,33 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __DRAWRECTANGLES_H +#define __DRAWRECTANGLES_H + +#include "libIGraph.h" +#include "Graphics.h" +#include "Pen.h" +#include "Brush.h" + +typedef void (*tFillRectangle)(tGraphics *pGraphics, tBrush *pBrush, I32 x, I32 y, I32 width, I32 height); +extern tFillRectangle mFillRectangle_[FMT_NUM]; +#define mFillRectangle(pGraphics, pBrush, x, y, width, height) mFillRectangle_[pGraphics->pixelFormatIndex](pGraphics, pBrush, x, y, width, height) + +#endif diff --git a/libIGraph/Exports.c b/libIGraph/Exports.c new file mode 100644 index 0000000..5121335 --- /dev/null +++ b/libIGraph/Exports.c @@ -0,0 +1,192 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "GetScreen.h" +#include "Graphics.h" +#include "DrawLines.h" +#include "DrawRectangles.h" +#include "Pen.h" +#include "Brush.h" +#include "FontFamily.h" +#include "Font.h" +#include "StringFormat.h" +#include "Text.h" +#include "Image.h" +#include "Bitmap.h" +#include "Region.h" +#include "DrawEllipses.h" + +EXPORT(tGraphics*) GetScreen(I32 *pXSize, I32 *pYSize, U32 *pPixelFormat) { + return GetScreen_(pXSize, pYSize, pPixelFormat); +} + +EXPORT(void) DisposeGraphics(tGraphics *pGraphics) { + DisposeGraphics_(pGraphics); +} + +EXPORT(void) Clear(tGraphics *pGraphics, U32 col) { + mClear(pGraphics, col); +} + +EXPORT(void) DrawLine_Ints(tGraphics *pGraphics, tPen *pPen, I32 x1, I32 y1, I32 x2, I32 y2) { + mDrawLine(pGraphics, pPen, x1, y1, x2, y2); +} + +EXPORT(void) FillRectangle_Ints(tGraphics *pGraphics, tBrush *pBrush, I32 x, I32 y, I32 width, I32 height) { + mFillRectangle(pGraphics, pBrush, x, y, width, height); +} + +EXPORT(void) DrawString(tGraphics *pGraphics, STRING2 s, tFont *pFont, tBrush *pBrush, I32 x1, I32 y1, I32 x2, I32 y2, tStringFormat *pFormat) { + DrawString_(pGraphics, s, pFont, pBrush, x1, y1, x2, y2, pFormat); +} + +EXPORT(tPen*) CreatePen_Color(float width, U32 col) { + return CreatePen_Color_(width, col); +} + +EXPORT(void) DisposePen(tPen *pPen) { + DisposePen_(pPen); +} + +EXPORT(tBrush*) CreateBrush_Solid(U32 col) { + return CreateBrush_Solid_(col); +} + +EXPORT(void) DisposeBrush(tBrush *pBrush) { + DisposeBrush_(pBrush); +} + +EXPORT(tFontFamily*) CreateFontFamily_Name(STRING name) { + return CreateFontFamily_Name_(name); +} + +EXPORT(void) DisposeFontFamily(tFontFamily *pFontFamily) { + DisposeFontFamily_(pFontFamily); +} + +EXPORT(tFont*) _CreateFont(tFontFamily *pFontFamily, float emSize, U32 fontStyle) { + return CreateFont_(pFontFamily, emSize, fontStyle); +} + +EXPORT(void) DisposeFont(tFont *pFont) { + DisposeFont_(pFont); +} + +EXPORT(tStringFormat*) CreateStringFormat(U32 alignment, U32 formatFlags, U32 lineAlignment, U32 stringTrimming) { + return CreateStringFormat_(alignment, formatFlags, lineAlignment, stringTrimming); +} + +EXPORT(void) DisposeStringFormat(tStringFormat *pStringFormat) { + DisposeStringFormat_(pStringFormat); +} + +EXPORT(void) StringFormat_SetTrimming(tStringFormat *pStringFormat, U32 stringTrimming) { + StringFormat_SetTrimming_(pStringFormat, stringTrimming); +} + +EXPORT(void) TextRenderingHint_Set(tGraphics *pGraphics, U32 textRenderingHint) { + TextRenderingHint_Set_(pGraphics, textRenderingHint); +} + +EXPORT(tBitmap*) _CreateBitmap(I32 width, I32 height, U32 pixelFormat) { + return CreateBitmap_(width, height, pixelFormat); +} + +EXPORT(tGraphics*) GetGraphicsFromImage(tImage *pImage) { + return GetGraphicsFromImage_(pImage); +} + +EXPORT(void) DrawImageUnscaled(tGraphics *pGraphics, tImage *pImage, I32 x, I32 y) { + DrawImageUnscaled_(pGraphics, pImage, x, y); +} + +EXPORT(void) DisposeImage(tImage *pImage) { + DisposeImage_(pImage); +} + +EXPORT(tBitmap*) BitmapFromFile(STRING filename, I32 *pWidth, I32 *pHeight, U32 *pPixelFormat) { + return BitmapFromFile_(filename, pWidth, pHeight, pPixelFormat); +} + +EXPORT(void) StringFormat_SetAlignment(tStringFormat *pStringFormat, U32 alignment) { + StringFormat_SetAlignment_(pStringFormat, alignment); +} + +EXPORT(void) StringFormat_SetLineAlignment(tStringFormat *pStringFormat, U32 lineAlignment) { + StringFormat_SetLineAlignment_(pStringFormat, lineAlignment); +} + +EXPORT(void) StringFormat_SetFormatFlags(tStringFormat *pStringFormat, U32 formatFlags) { + StringFormat_SetFormatFlags_(pStringFormat, formatFlags); +} + +EXPORT(tBrush*) CreateBrush_Hatch(U32 hatchStyle, U32 foreCol, U32 backCol) { + return CreateBrush_Hatch_(hatchStyle, foreCol, backCol); +} + +EXPORT(U32) IsKeyDown_Internal(U32 key) { + return IsKeyDown_Internal_(key); +} + +EXPORT(U32) LatestKeyUp_Internal() { + return LatestKeyUp_Internal_(); +} + +EXPORT(U32) LatestKeyDown_Internal() { + return LatestKeyDown_Internal_(); +} + +EXPORT(tBrush*) CreateBrush_LinearGradient(I32 x1, I32 y1, I32 x2, I32 y2, U32 col1, U32 col2) { + return CreateBrush_LinearGradient_(x1, y1, x2, y2, col1, col2); +} + +EXPORT(tRegion*) CreateRegion_Rect(I32 x, I32 y, I32 width, I32 height) { + return CreateRegion_Rect_(x, y, width, height); +} + +EXPORT(void) DisposeRegion(tRegion *pRegion) { + DisposeRegion_(pRegion); +} + +EXPORT(void) Graphics_SetClip(tGraphics *pGraphics, tRegion *pRegion) { + Graphics_SetClip_(pGraphics, pRegion); +} + +EXPORT(tRegion*) CreateRegion_Infinite() { + return CreateRegion_Infinite_(); +} + +EXPORT(void) MeasureString(tGraphics *pGraphics, STRING2 s, tFont *pFont, I32 width, tStringFormat *pFormat, U32 *pSzWidth, U32 *pSzHeight) { + MeasureString_(pGraphics, s, pFont, width, pFormat, pSzWidth, pSzHeight); +} + +EXPORT(void) DrawEllipse_Ints(tGraphics *pGraphics, tPen *pPen, I32 x, I32 y, I32 width, I32 height) { + mDrawEllipse(pGraphics, pPen, x, y, width, height); +} + +EXPORT(void) FillEllipse_Ints(tGraphics *pGraphics, tBrush *pBrush, I32 x, I32 y, I32 width, I32 height) { + mFillEllipse(pGraphics, pBrush, x, y, width, height); +} + +EXPORT(void) Graphics_CopyFromScreen(tGraphics *pGraphics, I32 srcX, I32 srcY, I32 destX, I32 destY, I32 sizeX, I32 sizeY) { + Graphics_CopyFromScreen_(pGraphics, srcX, srcY, destX, destY, sizeX, sizeY); +} diff --git a/libIGraph/Font.c b/libIGraph/Font.c new file mode 100644 index 0000000..322e2c7 --- /dev/null +++ b/libIGraph/Font.c @@ -0,0 +1,41 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "Font.h" +#include "Text.h" + +tFont* CreateFont_(tFontFamily *pFontFamily, float emSize, U32 fontStyle) { + tFont *pFont = TMALLOC(tFont); + + pFont->pFontFamily = pFontFamily; + pFont->emSize = emSize; + pFont->fontStyle = fontStyle; + + Text_EnsureFontMetrics(pFont); + + return pFont; +} + +void DisposeFont_(tFont *pFont) { + Text_RemoveFont(pFont); + free(pFont); +} \ No newline at end of file diff --git a/libIGraph/Font.h b/libIGraph/Font.h new file mode 100644 index 0000000..a2cb853 --- /dev/null +++ b/libIGraph/Font.h @@ -0,0 +1,49 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __FONT_H +#define __FONT_H + +#include "FontFamily.h" + +typedef struct tFont_ tFont; +struct tFont_ { + tFontFamily *pFontFamily; + float emSize; + U32 fontStyle; + + // Cache information about this font + I32 unitsPerEm; + I32 ascender, descender; + I32 height; + I32 maxAdvanceWidth, maxAdvanceHeight; + I32 underlinePosition; + I32 underlineThickness; + U32 charMapIndex; + + // And pre-calculated pixel values + I32 pixelSizeX, pixelSizeY; + I32 pixelAscender, pixelDescender, pixelHeight; +}; + +tFont* CreateFont_(tFontFamily *pFontFamily, float emSize, U32 fontStyle); +void DisposeFont_(tFont *pFont); + +#endif diff --git a/libIGraph/FontFamily.c b/libIGraph/FontFamily.c new file mode 100644 index 0000000..9688ca4 --- /dev/null +++ b/libIGraph/FontFamily.c @@ -0,0 +1,36 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "FontFamily.h" + +tFontFamily* CreateFontFamily_Name_(STRING name) { + tFontFamily *pFontFamily = TMALLOC(tFontFamily); + + pFontFamily->familyName = malloc(strlen(name)+1); + strcpy(pFontFamily->familyName, name); + + return pFontFamily; +} + +void DisposeFontFamily_(tFontFamily *pFontFamily) { + free(pFontFamily); +} \ No newline at end of file diff --git a/libIGraph/FontFamily.h b/libIGraph/FontFamily.h new file mode 100644 index 0000000..7aa6a68 --- /dev/null +++ b/libIGraph/FontFamily.h @@ -0,0 +1,32 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __FONTFAMILY_H +#define __FONTFAMILY_H + +typedef struct tFontFamily_ tFontFamily; +struct tFontFamily_ { + STRING familyName; +}; + +tFontFamily* CreateFontFamily_Name_(STRING name); +void DisposeFontFamily_(tFontFamily *pFontFamily); + +#endif diff --git a/libIGraph/GetScreen.c b/libIGraph/GetScreen.c new file mode 100644 index 0000000..2609569 --- /dev/null +++ b/libIGraph/GetScreen.c @@ -0,0 +1,497 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "Graphics.h" + +#define XSIZE 320 +#define YSIZE 240 + +#define KEYPAD_0 0 +#define KEYPAD_1 1 +#define KEYPAD_2 2 +#define KEYPAD_3 3 +#define KEYPAD_4 4 +#define KEYPAD_5 5 +#define KEYPAD_6 6 +#define KEYPAD_7 7 +#define KEYPAD_8 8 +#define KEYPAD_9 9 +#define KEYPAD_C 10 +#define KEYPAD_OK 11 + +static tGraphics screen; +static U32 windowCreated = 0; + +static U8 keyState[12]; +static U32 latestKeyDown = 0xffffffff, latestKeyUp = 0xffffffff; + +U32 GetScreenPixel(I32 x, I32 y) { + if (windowCreated) { + U8* pMem = (U8*)screen.pScan0 + screen.stride*y + (x >> 1); + U8 b = *pMem; + b = (x&1)?b&0xf:b>>4; +#ifdef INVERT_4BPP_GRAY + b = 15 - b; +#endif + b = (b << 4) | b; + return ARGB(0xff, b, b, b); + } else { + return 0xff000000; + } +} + +#ifdef WIN32 + +static HBITMAP hBackBuffer; +static int doUpdates = 0; // Should be do periodic updates of the window + +static void UpdateScreenWindow() { + PAINTSTRUCT ps; + HDC memHdc; + HGDIOBJ orgObj; + + BeginPaint((HWND)screen.screenPtr, &ps); + + memHdc = CreateCompatibleDC(ps.hdc); + orgObj = SelectObject(memHdc, hBackBuffer); + BitBlt(ps.hdc, 0, 0, screen.xSize, screen.ySize, memHdc, 0, 0, SRCCOPY); + SelectObject(memHdc, orgObj); + DeleteObject(memHdc); + EndPaint((HWND)screen.screenPtr, &ps); +} + +U32 IsKeyDown_Internal_(U32 key) { + return keyState[key]; +} + +U32 LatestKeyUp_Internal_() { + U32 ret = latestKeyUp; + latestKeyUp = 0xffffffff; + return ret; +} + +U32 LatestKeyDown_Internal_() { + U32 ret = latestKeyDown; + latestKeyDown = 0xffffffff; + return ret; +} + +static U32 MapKey(U32 keyCode) { + switch (keyCode) { + case 48: + case 96: + return KEYPAD_0; + case 49: + case 97: + return KEYPAD_1; + case 50: + case 98: + return KEYPAD_2; + case 51: + case 99: + return KEYPAD_3; + case 52: + case 100: + return KEYPAD_4; + case 53: + case 101: + return KEYPAD_5; + case 54: + case 102: + return KEYPAD_6; + case 55: + case 103: + return KEYPAD_7; + case 56: + case 104: + return KEYPAD_8; + case 57: + case 105: + return KEYPAD_9; + case 27: + return KEYPAD_C; + case 13: + return KEYPAD_OK; + default: + return 0xffffffff; + } +} + +static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + U32 key; + switch (uMsg) { + case WM_CLOSE: + // Tell the program to end, and dispatch WM_DESTROY + DestroyWindow(hWnd); + break; + case WM_DESTROY: + // End the program. + PostQuitMessage(0); + exit(0); + break; + case WM_TIMER: + // Update window contents if doUpdates is 1 + if (doUpdates) { + InvalidateRect((HWND)screen.screenPtr, NULL, 0); + } + break; + case WM_PAINT: + if (windowCreated) { + UpdateScreenWindow(); + } else { + return DefWindowProc(hWnd, uMsg, wParam, lParam); + } + break; + case WM_ERASEBKGND: + break; + case WM_KEYDOWN: + key = MapKey((U32)wParam); + if (key <= 12) { + keyState[key] = 1; + } + latestKeyDown = key; + break; + case WM_KEYUP: + key = MapKey((U32)wParam); + if (key <= 12) { + keyState[key] = 0; + } + latestKeyUp = key; + break; + default: + return DefWindowProc(hWnd, uMsg, wParam, lParam); + } + return 0; +} + +static const WCHAR className[] = L"DotNetAnywhere"; + +static DWORD WINAPI WindowMessagePump(void *arg) { + + WNDCLASSEX wc; + HWND hWnd; + HINSTANCE hInstance; + MSG msg; + BITMAPINFO *pBmpInfo; + U32 i; + RECT r; + DWORD winStyle, winExStyle; + + hInstance = GetModuleHandle(NULL); + + wc.cbSize = sizeof(WNDCLASSEX); + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hbrBackground = (HBRUSH)(COLOR_WINDOW); + wc.hCursor = LoadCursor(hInstance, IDC_ARROW); + wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION); + wc.hIconSm = LoadIcon(hInstance, IDI_APPLICATION); + wc.hInstance = hInstance; + wc.lpfnWndProc = WndProc; + wc.lpszClassName = className; + wc.lpszMenuName = NULL; + wc.style = 0; + + if (!RegisterClassEx(&wc)) { + // Error + printf("[libIGraph] ERROR: Cannot register window class. error=0x%08x\n", GetLastError()); + windowCreated = 2; + return 0; + } + + winStyle = WS_OVERLAPPEDWINDOW; + winExStyle = WS_EX_WINDOWEDGE; + + r.left = 100; + r.top = 100; + r.right = 100 + XSIZE; + r.bottom = 100 + YSIZE; + AdjustWindowRectEx(&r, winStyle, 0, winExStyle); + + hWnd = CreateWindowEx(winExStyle, className, L"Dot Net Anywhere", winStyle, + CW_USEDEFAULT, CW_USEDEFAULT, r.right - r.left, r.bottom - r.top, NULL, NULL, hInstance, NULL); + if (hWnd == NULL) { + printf("[libIGraph] ERROR: Cannot create window. error=0x%08x\n", GetLastError()); + windowCreated = 2; + return 0; + } + + ShowWindow(hWnd, SW_SHOWNORMAL); + UpdateWindow(hWnd); + + memset(&screen, 0, sizeof(tGraphics)); + screen.xSize = XSIZE; + screen.ySize = YSIZE; + screen.pixelFormat = PixelFormat_Gdi; + screen.pixelFormatIndex = FMT_4BPP_GRAY; + screen.stride = XSIZE / 2; + screen.textRenderingHint = TextRenderingHint_SystemDefault; + screen.pImage = NULL; + // Create a memory back-buffer for the screen/window + + pBmpInfo = (BITMAPINFO*)malloc(sizeof(BITMAPINFOHEADER) + 16*4); + pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + pBmpInfo->bmiHeader.biWidth = XSIZE; + pBmpInfo->bmiHeader.biHeight = -YSIZE; + pBmpInfo->bmiHeader.biPlanes = 1; + pBmpInfo->bmiHeader.biBitCount = 4; + pBmpInfo->bmiHeader.biCompression = BI_RGB; + pBmpInfo->bmiHeader.biSizeImage = 0; + pBmpInfo->bmiHeader.biXPelsPerMeter = 0; + pBmpInfo->bmiHeader.biYPelsPerMeter = 0; + pBmpInfo->bmiHeader.biClrUsed = 0; + pBmpInfo->bmiHeader.biClrImportant = 0; + for (i=0; i<16; i++) { + U32 c = i | (i << 4); + pBmpInfo->bmiColors[i].rgbRed = c; + pBmpInfo->bmiColors[i].rgbGreen = c; + pBmpInfo->bmiColors[i].rgbBlue = c; + } + hBackBuffer = CreateDIBSection(NULL, pBmpInfo, DIB_RGB_COLORS, &screen.pScan0, NULL, 0); + + screen.memSize = XSIZE * YSIZE / 2; + screen.screenPtr = hWnd; + + windowCreated = 1; + + // Create a timer to update the window from the back-buffer + SetTimer(hWnd, 1, 40, NULL); + + while (GetMessage(&msg, NULL, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + return 0; +} + +tGraphics* GetScreen_(I32 *pXSize, I32 *pYSize, U32 *pPixelFormat) { + + // Create a new thread to handle all the window messages + DWORD threadID; + HANDLE hThread; + int i; + + if (windowCreated == 0) { + // Only need to create the window if it hasn't already been done. + + // Initialise the keyState + memset(keyState, 0, 12); + + hThread = CreateThread(NULL, 0, WindowMessagePump, NULL, 0, &threadID); + if (hThread == NULL) { + // Failed to create thread + printf("[libIGraph] ERROR: Failed to create window thread. error=0x%08x\n", GetLastError()); + return NULL; + } + + // Wait for the window to be created + i = 0; + while (windowCreated == 0) { + Sleep(1); + i++; + if (i>1000) { + printf("[libIGraph] ERROR: Window creation timed-out\n"); + return NULL; + } + } + + if (windowCreated == 2) { + windowCreated = 0; + // Error + return NULL; + } + } + + doUpdates++; + + *pXSize = screen.xSize; + *pYSize = screen.ySize; + *pPixelFormat = screen.pixelFormat; + return &screen; +} + +void ScreenDispose() { + doUpdates--; + if (doUpdates == 0) { + // If this is the last screen Graphics to be disposed of, then do one last window update + InvalidateRect((HWND)screen.screenPtr, NULL, 0); + } +} + +#else + +#include + +tGraphics* GetScreen_(I32 *pXSize, I32 *pYSize, U32 *pPixelFormat) { + if (windowCreated == 0) { + int s; + + // Initialise the keyState + memset(keyState, 0, 12); + + memset(&screen, 0, sizeof(tGraphics)); + screen.xSize = XSIZE; + screen.ySize = YSIZE; + screen.pixelFormat = PixelFormat_Gdi; + screen.pixelFormatIndex = FMT_4BPP_GRAY; + screen.stride = XSIZE / 2; + screen.screenPtr = NULL; + screen.memSize = XSIZE * YSIZE / 2; + screen.textRenderingHint = TextRenderingHint_SystemDefault; + screen.pImage = NULL; + + s = open("/dev/wsdisplay0", O_RDWR, 0); + if (s <= 0) { + printf("[libIGraph] ERROR: Cannot open /dev/wsdisplay0\n"); + return NULL; + } + + screen.pScan0 = mmap(0, screen.memSize, PROT_READ|PROT_WRITE, MAP_SHARED, s, 0); + if (screen.pScan0 == MAP_FAILED) { + printf("[libIGraph] ERROR: Failed to mmap() frame-buffer\n"); + return NULL; + } + + windowCreated = 1; + } + + *pXSize = XSIZE; + *pYSize = YSIZE; + *pPixelFormat = screen.pixelFormat; + + return &screen; +} + +void ScreenDispose(){ + // Nothing needs to be done. +} + +static int keyb = -1; +static void ProcessKeyPad() { + + struct wscons_event e; + fd_set readfds; + int res; + struct timeval tv_timeout; + + if (keyb == -1) { + // Open keyboard device + keyb = open("/dev/wskbd0",O_RDWR,0); + if (keyb < 0) { + printf("[libIGraph] Error: Cannot open keyboard device: /dev/wskbd0"); + exit(2); + } + } + + tv_timeout.tv_sec = 0; + tv_timeout.tv_usec = 0; + FD_ZERO(&readfds); + FD_SET(keyb,&readfds); + + for (;;) { + U32 key; + res = select(FD_SETSIZE,&readfds,NULL,NULL,&tv_timeout); + if (res <= 0) { + // Timeout + break; + } + res = read(keyb,&e,sizeof(e)); + if (res != sizeof(struct wscons_event)) { + break; + } + switch (e.value) { + case '0': + key = KEYPAD_0; + break; + case '1': + key = KEYPAD_1; + break; + case '2': + key = KEYPAD_2; + break; + case '3': + key = KEYPAD_3; + break; + case '4': + key = KEYPAD_4; + break; + case '5': + key = KEYPAD_5; + break; + case '6': + key = KEYPAD_6; + break; + case '7': + key = KEYPAD_7; + break; + case '8': + key = KEYPAD_8; + break; + case '9': + key = KEYPAD_9; + break; + case '.': + key = KEYPAD_OK; + break; + case 'x': + key = KEYPAD_C; + break; + default: + continue; + } + switch (e.type) { + case WSCONS_EVENT_KEY_DOWN: + keyState[key] = 1; + latestKeyDown = key; + break; + case WSCONS_EVENT_KEY_UP: + keyState[key] = 0; + latestKeyUp = key; + break; + } + } + +} + +U32 IsKeyDown_Internal_(U32 key) { + ProcessKeyPad(); + return keyState[key]; +} + +U32 LatestKeyUp_Internal_() { + U32 ret; + ProcessKeyPad(); + ret = latestKeyUp; + latestKeyUp = 0xffffffff; + return ret; +} + +U32 LatestKeyDown_Internal_() { + U32 ret; + ProcessKeyPad(); + ret = latestKeyDown; + latestKeyDown = 0xffffffff; + return ret; +} + +#endif diff --git a/libIGraph/GetScreen.h b/libIGraph/GetScreen.h new file mode 100644 index 0000000..cd6efd6 --- /dev/null +++ b/libIGraph/GetScreen.h @@ -0,0 +1,35 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __GETSCREEN_H +#define __GETSCREEN_H + +#include "libIGraph.h" +#include "Graphics.h" + +tGraphics* GetScreen_(I32 *pXSize, I32 *pYSize, U32 *pPixelFormat); +void ScreenDispose(); +U32 GetScreenPixel(I32 x, I32 y); + +U32 IsKeyDown_Internal_(U32 key); +U32 LatestKeyUp_Internal_(); +U32 LatestKeyDown_Internal_(); + +#endif \ No newline at end of file diff --git a/libIGraph/Graphics.c b/libIGraph/Graphics.c new file mode 100644 index 0000000..42a3f3d --- /dev/null +++ b/libIGraph/Graphics.c @@ -0,0 +1,121 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "Graphics.h" +#include "GetScreen.h" +#include "Pixels.h" +#include "Image.h" + +tGraphics* InitGraphics() { + tGraphics *pGraphics = TMALLOC(tGraphics); + + memset(pGraphics, 0, sizeof(tGraphics)); + + return pGraphics; +} + +void DisposeGraphics_(tGraphics *pGraphics) { + if (pGraphics->screenPtr != NULL) { + // This is the screen window + ScreenDispose(); + } else { + // This is an bitmap of some kind + } +} + +void TextRenderingHint_Set_(tGraphics *pGraphics, U32 textRenderingHint) { + pGraphics->textRenderingHint = textRenderingHint; +} + +static void Clear_WithClipping(tGraphics *pGraphics, U32 col) { + tRegion *pClip = pGraphics->pClip; + U32 x0 = (pClip->x1 > 0) ? pClip->x1 : 0; + U32 x1 = (pClip->x2 < pGraphics->xSize) ? pClip->x2 : pGraphics->xSize; + U32 y0 = (pClip->y1 > 0) ? pClip->y1 : 0; + U32 y1 = (pClip->y2 < pGraphics->ySize) ? pClip->y2 : pGraphics->ySize; + U32 x, y; + for (y = y0; ypClip->isInfinite) { + Clear_WithClipping(pGraphics, col); + } else { + U8 col4 = COL2GRAY(col) >> 4; +#ifdef INVERT_4BPP_GRAY + col4 = 15 - col4; +#endif + memset(pGraphics->pScan0, col4 | (col4 << 4), pGraphics->memSize); + } +} + +static void Clear_FMT_32BPP_ARGB(tGraphics *pGraphics, U32 col) { + if (!pGraphics->pClip->isInfinite) { + Clear_WithClipping(pGraphics, col); + } else { + void *pEnd = ((U8*)pGraphics->pScan0) + pGraphics->stride * pGraphics->ySize; + U32 *pMem = (U32*)pGraphics->pScan0; + while ((void*)pMem < pEnd) { + *pMem++ = col; + } + } +} + +tClear mClear_[FMT_NUM] = { + Clear_FMT_4BPP_GRAY, + Clear_FMT_32BPP_ARGB +}; + +void DrawImageUnscaled_(tGraphics *pGraphics, tImage *pImage, I32 x, I32 y) { + I32 xPos, yPos; + U32 col; + + // TODO: Optimize!!! + for (yPos = 0; yPos < pImage->height; yPos++) { + for (xPos = 0; xPos < pImage->width; xPos++) { + col = mImage_GetPixel(pImage, xPos, yPos); + mSetPixel(pGraphics, x + xPos, y + yPos, col); + } + } +} + +void Graphics_SetClip_(tGraphics *pGraphics, tRegion *pRegion) { + pGraphics->pClip = pRegion; +} + +void Graphics_CopyFromScreen_(tGraphics *pGraphics, I32 srcX, I32 srcY, I32 destX, I32 destY, I32 sizeX, I32 sizeY) { + I32 x, y, dx, dy; + I32 xEnd = srcX + sizeX; + I32 yEnd = srcY + sizeY; + + // TODO: Optimize!!! + for (y=srcY, dy=destY; ypixelFormatIndex](pGraphics, col) + +void DrawImageUnscaled_(tGraphics *pGraphics, tImage *pImage, I32 x, I32 y); +void Graphics_SetClip_(tGraphics *pGraphics, tRegion *pRegion); +void Graphics_CopyFromScreen_(tGraphics *pGraphics, I32 srcX, I32 srcY, I32 destX, I32 destY, I32 sizeX, I32 sizeY); + +#endif diff --git a/libIGraph/HatchBrushDefs.h b/libIGraph/HatchBrushDefs.h new file mode 100644 index 0000000..46a18d8 --- /dev/null +++ b/libIGraph/HatchBrushDefs.h @@ -0,0 +1,75 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +static U8 hatchDefs[53][8] = { + {0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}, + {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,}, + {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,}, + {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,}, + {0xff,0x01,0x01,0x01,0x01,0x01,0x01,0x01,}, + {0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,}, + {0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,}, + {0x01,0x00,0x10,0x00,0x01,0x00,0x10,0x00,}, + {0x11,0x00,0x44,0x00,0x11,0x00,0x44,0x00,}, + {0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,}, + {0x55,0x22,0x55,0x88,0x55,0x22,0x55,0x88,}, + {0x55,0xaa,0x55,0x8a,0x55,0xaa,0x55,0xa8,}, + {0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,}, + {0x77,0xaa,0xdd,0xaa,0x77,0xaa,0xdd,0xaa,}, + {0xee,0xbb,0xee,0xbb,0xee,0xbb,0xee,0xbb,}, + {0xee,0xff,0xbb,0xff,0xee,0xff,0xbb,0xff,}, + {0xf7,0xff,0x7f,0xff,0xf7,0xff,0x7f,0xff,}, + {0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xfe,}, + {0x11,0x22,0x44,0x88,0x11,0x22,0x44,0x88,}, + {0x88,0x44,0x22,0x11,0x88,0x44,0x22,0x11,}, + {0x33,0x66,0xcc,0x99,0x33,0x66,0xcc,0x99,}, + {0xcc,0x66,0x33,0x99,0xcc,0x66,0x33,0x99,}, + {0x83,0x07,0x0e,0x1c,0x38,0x70,0xe0,0xc1,}, + {0xc1,0xe0,0x70,0x38,0x1c,0x0e,0x07,0x83,}, + {0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,}, + {0xff,0x00,0x00,0x00,0xff,0x00,0x00,0x00,}, + {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,}, + {0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,}, + {0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,}, + {0xff,0xff,0x00,0x00,0xff,0xff,0x00,0x00,}, + {0x00,0x00,0x11,0x22,0x44,0x88,0x00,0x00,}, + {0x00,0x00,0x88,0x44,0x22,0x11,0x00,0x00,}, + {0x0f,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,}, + {0x01,0x01,0x01,0x01,0x10,0x10,0x10,0x10,}, + {0x01,0x10,0x02,0x40,0x08,0x80,0x04,0x20,}, + {0x8d,0x0c,0xc0,0xd8,0x1b,0x03,0x30,0xb1,}, + {0x81,0x42,0x24,0x18,0x81,0x42,0x24,0x18,}, + {0x00,0x18,0xa4,0x03,0x00,0x18,0xa4,0x03,}, + {0x80,0x40,0x20,0x10,0x18,0x24,0x42,0x81,}, + {0xff,0x01,0x01,0x01,0xff,0x10,0x10,0x10,}, + {0x11,0x2a,0x44,0xa2,0x11,0x28,0x44,0x8a,}, + {0x55,0xaa,0x55,0xaa,0x0f,0x0f,0x0f,0x0f,}, + {0x00,0x08,0x10,0x08,0x00,0x01,0x80,0x01,}, + {0x55,0x00,0x01,0x00,0x01,0x00,0x01,0x00,}, + {0x01,0x00,0x44,0x00,0x10,0x00,0x44,0x00,}, + {0xc0,0x21,0x12,0x0c,0x30,0x40,0x80,0x80,}, + {0xff,0x66,0xff,0x99,0xff,0x66,0xff,0x99,}, + {0xee,0x91,0xf1,0xf1,0xee,0x19,0x1f,0x1f,}, + {0xff,0x11,0x11,0x11,0xff,0x11,0x11,0x11,}, + {0x99,0x66,0x66,0x99,0x99,0x66,0x66,0x99,}, + {0x0f,0x0f,0x0f,0x0f,0xf0,0xf0,0xf0,0xf0,}, + {0x41,0x22,0x14,0x08,0x14,0x22,0x41,0x80,}, + {0x08,0x1c,0x3e,0x7f,0x3e,0x1c,0x08,0x00,}, +}; diff --git a/libIGraph/Image.c b/libIGraph/Image.c new file mode 100644 index 0000000..914d922 --- /dev/null +++ b/libIGraph/Image.c @@ -0,0 +1,82 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "Image.h" +#include "Bitmap.h" + +U32 InitImage(tImage *pImage, U32 imageType, I32 width, I32 height, U32 pixelFormat) { + pImage->imageType = imageType; + pImage->width = width; + pImage->height = height; + pImage->pixelFormat = pixelFormat; + pImage->graphicsRefCount = 0; + pImage->pGraphics = NULL; + switch (pixelFormat) { + case PixelFormat_Gdi: + pImage->pixelFormatIndex = FMT_4BPP_GRAY; + break; + case PixelFormat_Format32bppArgb: + pImage->pixelFormatIndex = FMT_32BPP_ARGB; + break; + default: + return 0; + } + return 1; +} + +void DisposeImage_(tImage *pImage) { + free(pImage); +} + +tGraphics* GetGraphicsFromImage_(tImage *pImage) { + if (pImage->pGraphics == NULL) { + // Create brand new graphics for this image + switch (pImage->imageType) { + case IMAGE_TYPE_BITMAP: + pImage->pGraphics = GetGraphicsFromBitmap_((tBitmap*)pImage); + break; + default: + return NULL; + } + } + + pImage->graphicsRefCount++; + return pImage->pGraphics; +} + +static U32 Image_GetPixel_Bitmap(tImage *pImage, I32 x, I32 y) { + tBitmap *pBitmap = (tBitmap*)pImage; + + switch (pBitmap->image.pixelFormatIndex) { + case FMT_4BPP_GRAY: + // NOT IMPLEMENTED YET + return 0xff000000; + case FMT_32BPP_ARGB: + return *(U32*)(((U8*)pBitmap->pBmp) + y * pBitmap->stride + (x << 2)); + default: + return 0; + } +} + +tImage_GetPixel mImage_GetPixel_[IMAGE_TYPE_NUM] = { + Image_GetPixel_Bitmap +}; \ No newline at end of file diff --git a/libIGraph/Image.h b/libIGraph/Image.h new file mode 100644 index 0000000..be41d91 --- /dev/null +++ b/libIGraph/Image.h @@ -0,0 +1,50 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __IMAGE_H +#define __IMAGE_H + +typedef struct tImage_ tImage; + +#include "libIGraph.h" + +#include "Graphics.h" + +#define IMAGE_TYPE_NUM 1 +#define IMAGE_TYPE_BITMAP 0 + +struct tImage_ { + U32 imageType; + I32 width, height; + U32 pixelFormat; + U32 pixelFormatIndex; + tGraphics *pGraphics; + U32 graphicsRefCount; +}; + +U32 InitImage(tImage *pImage, U32 imageType, I32 width, I32 height, U32 pixelFormat); +void DisposeImage_(tImage *pImage); +tGraphics* GetGraphicsFromImage_(tImage *pImage); + +typedef U32 (*tImage_GetPixel)(tImage *pImage, I32 x, I32 y); +extern tImage_GetPixel mImage_GetPixel_[IMAGE_TYPE_NUM]; +#define mImage_GetPixel(pImage, x, y) mImage_GetPixel_[pImage->imageType](pImage, x, y) + +#endif diff --git a/libIGraph/Makefile b/libIGraph/Makefile new file mode 100644 index 0000000..3d1cd53 --- /dev/null +++ b/libIGraph/Makefile @@ -0,0 +1,36 @@ +.include + +PROG= libIGraph.so.0.1 +#PROG= Test + +SRCS= libIGraph.c +SRCS+= tinyjpeg.c +SRCS+= jidctflt.c +SRCS+= Bitmap.c +SRCS+= BitmapLoader.c +SRCS+= Brush.c +SRCS+= DrawEllipses.c +SRCS+= DrawLines.c +SRCS+= DrawRectangles.c +SRCS+= Exports.c +SRCS+= Font.c +SRCS+= FontFamily.c +SRCS+= GetScreen.c +SRCS+= Graphics.c +SRCS+= Image.c +SRCS+= Pen.c +SRCS+= Pixels.c +SRCS+= Region.c +SRCS+= StringFormat.c +SRCS+= Text.c + +CFLAGS= -Os -I. -I./include -I./include/freetype -Wall -Werror +#-mips2 -mcpu=r3900 +#CFLAGS= -O0 -g -I. -I./include -I./include/freetype -Wall -Werror + +LDFLAGS+=--no-undefined -shared +LDADD+=./lib/libfreetype.so.9 +LDADD+=-s + +.include + diff --git a/libIGraph/Pen.c b/libIGraph/Pen.c new file mode 100644 index 0000000..30da7c4 --- /dev/null +++ b/libIGraph/Pen.c @@ -0,0 +1,36 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "Pen.h" + +tPen* CreatePen_Color_(float width, U32 col) { + tPen *pPen = TMALLOC(tPen); + + pPen->width = width; + pPen->col = col; + + return pPen; +} + +void DisposePen_(tPen *pPen) { + free(pPen); +} \ No newline at end of file diff --git a/libIGraph/Pen.h b/libIGraph/Pen.h new file mode 100644 index 0000000..c94dbb9 --- /dev/null +++ b/libIGraph/Pen.h @@ -0,0 +1,33 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __PEN_H +#define __PEN_H + +typedef struct tPen_ tPen; +struct tPen_ { + float width; + U32 col; +}; + +tPen* CreatePen_Color_(float width, U32 col); +void DisposePen_(tPen *pPen); + +#endif diff --git a/libIGraph/Pixels.c b/libIGraph/Pixels.c new file mode 100644 index 0000000..907f901 --- /dev/null +++ b/libIGraph/Pixels.c @@ -0,0 +1,151 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "Pixels.h" + +static void SetPixelNoBlend_FMT_4BPP_GRAY(tGraphics *pGraphics, I32 x, I32 y, U32 col) { + if (x<0 || y<0 || x>=pGraphics->xSize || y>=pGraphics->ySize) { + return; + } + if (!pGraphics->pClip->isInfinite){ + tRegion *pClip = pGraphics->pClip; + if (xx1 || yy1 || x>=pClip->x2 || y>=pClip->y2) { + return; + } + } + { + U8 *pMem = ((U8*)pGraphics->pScan0) + (y * pGraphics->stride) + (x >> 1); + U32 gray = COL2GRAY(col); +#ifdef INVERT_4BPP_GRAY + gray = 255 - gray; +#endif + if (x&1) { + // 'Odd' pixels + *pMem = (*pMem & 0xf0) | (gray >> 4); + } else { + // 'Even' pixels + *pMem = (*pMem & 0x0f) | (gray & 0xf0); + } + } +} + +static void SetPixelNoBlend_FMT_32BPP_ARGB(tGraphics *pGraphics, I32 x, I32 y, U32 col) { + if (x<0 || y<0 || x>=pGraphics->xSize || y>=pGraphics->ySize) { + return; + } + if (!pGraphics->pClip->isInfinite){ + tRegion *pClip = pGraphics->pClip; + if (xx1 || yy1 || x>=pClip->x2 || y>=pClip->y2) { + return; + } + } + { + U32 *pMem; + pMem = (U32*)(((U8*)pGraphics->pScan0) + y * pGraphics->stride + (x << 2)); + *pMem = col; + } +} + +tSetPixel mSetPixelNoBlend_[FMT_NUM] = { + SetPixelNoBlend_FMT_4BPP_GRAY, + SetPixelNoBlend_FMT_32BPP_ARGB +}; + +static void SetPixel_FMT_4BPP_GRAY(tGraphics *pGraphics, I32 x, I32 y, U32 col) { + if (x<0 || y<0 || x>=pGraphics->xSize || y>=pGraphics->ySize) { + return; + } + if (!pGraphics->pClip->isInfinite){ + tRegion *pClip = pGraphics->pClip; + if (xx1 || yy1 || x>=pClip->x2 || y>=pClip->y2) { + return; + } + } + { + U8 *pMem = ((U8*)pGraphics->pScan0) + (y * pGraphics->stride) + (x >> 1); + U32 opacity = A(col); + U32 gray = COL2GRAY(col); +#ifdef INVERT_4BPP_GRAY + gray = 255 - gray; +#endif + if (x&1) { + // 'Odd' pixels + U32 curPix = *pMem; + U32 newPix = curPix & 0x0f; + newPix |= newPix << 4; // Bring into range 0 - 255 + newPix = ((newPix * (255 - opacity)) + (gray * opacity)) >> 8; + *pMem = (curPix & 0xf0) | (newPix >> 4); + } else { + // 'Even' pixels + U32 curPix = *pMem; + U32 newPix = curPix & 0xf0; + newPix |= newPix >> 4; // Bring into range 0 - 255 + newPix = ((newPix * (255 - opacity)) + (gray * opacity)) >> 8; + *pMem = (curPix & 0x0f) | (newPix & 0xf0); + } + } +} + +static void SetPixel_FMT_32BPP_ARGB(tGraphics *pGraphics, I32 x, I32 y, U32 col) { + if (x<0 || y<0 || x>=pGraphics->xSize || y>=pGraphics->ySize) { + return; + } + if (!pGraphics->pClip->isInfinite){ + tRegion *pClip = pGraphics->pClip; + if (xx1 || yy1 || x>=pClip->x2 || y>=pClip->y2) { + return; + } + } + { + U32 *pMem; + U32 cur; + U32 rCur, gCur, bCur, aCur; + U32 rCol, gCol, bCol, aCol; + + pMem = (U32*)(((U8*)pGraphics->pScan0) + y * pGraphics->stride + (x << 2)); + cur = *pMem; + + aCur = A(cur); + rCur = R(cur); + gCur = G(cur); + bCur = B(cur); + + aCol = A(col); + rCol = R(col); + gCol = G(col); + bCol = B(col); + + rCur = (rCol * aCol + rCur * (255 - aCol)) / 255; + gCur = (gCol * aCol + gCur * (255 - aCol)) / 255; + bCur = (bCol * aCol + bCur * (255 - aCol)) / 255; + aCur = (aCol * aCol + aCur * (255 - aCol)) / 255; + + cur = ARGB(aCur,rCur,bCur,gCur); + + *pMem = cur; + } +} + +tSetPixel mSetPixel_[FMT_NUM] = { + SetPixel_FMT_4BPP_GRAY, + SetPixel_FMT_32BPP_ARGB +}; diff --git a/libIGraph/Pixels.h b/libIGraph/Pixels.h new file mode 100644 index 0000000..fd465cc --- /dev/null +++ b/libIGraph/Pixels.h @@ -0,0 +1,33 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __PIXELS_H +#define __PIXELS_H + +#include "libIGraph.h" +#include "Graphics.h" + +typedef void (*tSetPixel)(tGraphics *pGraphics, I32 x, I32 y, U32 col); +extern tSetPixel mSetPixel_[FMT_NUM]; +#define mSetPixel(pGraphics, x, y, col) mSetPixel_[pGraphics->pixelFormatIndex](pGraphics, x, y, col) +extern tSetPixel mSetPixelNoBlend_[FMT_NUM]; +#define mSetPixelNoBlend(pGraphics, x, y, col) mSetPixelNoBlend_[pGraphics->pixelFormatIndex](pGraphics, x, y, col) + +#endif diff --git a/libIGraph/Region.c b/libIGraph/Region.c new file mode 100644 index 0000000..12e4032 --- /dev/null +++ b/libIGraph/Region.c @@ -0,0 +1,52 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "Region.h" + +tRegion* CreateRegion_Infinite_() { + tRegion *pRegion = TMALLOC(tRegion); + + pRegion->x1 = 0; + pRegion->y1 = 0; + pRegion->x2 = 0; + pRegion->y2 = 0; + pRegion->isInfinite = 1; + + return pRegion; +} + +tRegion* CreateRegion_Rect_(I32 x, I32 y, I32 width, I32 height) { + tRegion *pRegion = TMALLOC(tRegion); + + pRegion->x1 = x; + pRegion->y1 = y; + pRegion->x2 = x + width; + pRegion->y2 = y + height; + pRegion->isInfinite = 0; + + return pRegion; +} + +void DisposeRegion_(tRegion *pRegion) { + free(pRegion); +} + diff --git a/libIGraph/Region.h b/libIGraph/Region.h new file mode 100644 index 0000000..7d46f4c --- /dev/null +++ b/libIGraph/Region.h @@ -0,0 +1,34 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __REGION_H +#define __REGION_H + +typedef struct tRegion_ tRegion; +struct tRegion_ { + I32 x1, y1, x2, y2; + U32 isInfinite; +}; + +tRegion* CreateRegion_Infinite_(); +tRegion* CreateRegion_Rect_(I32 x, I32 y, I32 width, I32 height); +void DisposeRegion_(tRegion *pRegion); + +#endif diff --git a/libIGraph/StringFormat.c b/libIGraph/StringFormat.c new file mode 100644 index 0000000..3a9d98c --- /dev/null +++ b/libIGraph/StringFormat.c @@ -0,0 +1,54 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +#include "StringFormat.h" + +tStringFormat* CreateStringFormat_(U32 alignment, U32 formatFlags, U32 lineAlignment, U32 stringTrimming) { + tStringFormat *pFormat = TMALLOC(tStringFormat); + + pFormat->alignment = alignment; + pFormat->formatFlags = formatFlags; + pFormat->lineAlignment = lineAlignment; + pFormat->stringTrimming = stringTrimming; + + return pFormat; +} + +void DisposeStringFormat_(tStringFormat *pStringFormat) { + free(pStringFormat); +} + +void StringFormat_SetTrimming_(tStringFormat *pStringFormat, U32 stringTrimming) { + pStringFormat->stringTrimming = stringTrimming; +} + +void StringFormat_SetAlignment_(tStringFormat *pStringFormat, U32 alignment) { + pStringFormat->alignment = alignment; +} + +void StringFormat_SetLineAlignment_(tStringFormat *pStringFormat, U32 lineAlignment) { + pStringFormat->lineAlignment = lineAlignment; +} + +void StringFormat_SetFormatFlags_(tStringFormat *pStringFormat, U32 formatFlags) { + pStringFormat->formatFlags = formatFlags; +} diff --git a/libIGraph/StringFormat.h b/libIGraph/StringFormat.h new file mode 100644 index 0000000..f5a7ee3 --- /dev/null +++ b/libIGraph/StringFormat.h @@ -0,0 +1,55 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __STRINGFORMAT_H +#define __STRINGFORMAT_H + +#include "libIGraph.h" + +#define StringFormatFlags_DirectionRightToLeft 0x1 +#define StringFormatFlags_DirectionVertical 0x2 +#define StringFormatFlags_FitBlackBox 0x4 +#define StringFormatFlags_DisplayFormatControl 0x20 +#define StringFormatFlags_NoFontFallback 0x400 +#define StringFormatFlags_MeasureTrailingSpaces 0x800 +#define StringFormatFlags_NoWrap 0x1000 +#define StringFormatFlags_LineLimit 0x2000 +#define StringFormatFlags_NoClip 0x4000 + +#define StringAlignment_Near 0 +#define StringAlignment_Center 1 +#define StringAlignment_Far 2 + +typedef struct tStringFormat_ tStringFormat; +struct tStringFormat_ { + U32 alignment; + U32 formatFlags; + U32 lineAlignment; + U32 stringTrimming; +}; + +tStringFormat* CreateStringFormat_(U32 alignment, U32 formatFlags, U32 lineAlignment, U32 stringTrimming); +void DisposeStringFormat_(tStringFormat *pStringFormat); +void StringFormat_SetTrimming_(tStringFormat *pStringFormat, U32 stringTrimming); +void StringFormat_SetAlignment_(tStringFormat *pStringFormat, U32 alignment); +void StringFormat_SetLineAlignment_(tStringFormat *pStringFormat, U32 lineAlignment); +void StringFormat_SetFormatFlags_(tStringFormat *pStringFormat, U32 formatFlags); + +#endif \ No newline at end of file diff --git a/libIGraph/Text.c b/libIGraph/Text.c new file mode 100644 index 0000000..afaa637 --- /dev/null +++ b/libIGraph/Text.c @@ -0,0 +1,431 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" + +// Only needed to make VS2005 editor work properly! +#include "Config.h" + +#include "Text.h" +#include "Pixels.h" +#include "Font.h" +#include "StringFormat.h" +#include "Brush.h" + +#ifdef INCLUDE_FREETYPE + +#include +#include FT_FREETYPE_H +#include FT_CACHE_H +#include FT_SFNT_NAMES_H + +#define FT_CHECKERROR(msg) \ + if (ftErr != 0) { \ + printf(msg " Error: %d\n", (int)ftErr); \ + exit(2); \ + } + +static FT_Library ftLib = NULL; +static FTC_Manager ftCache = NULL; +static FTC_CMapCache ftCMapCache = NULL; +static FTC_ImageCache ftImageCache = NULL; + +static void ShowFTBitmap_All(tGraphics *pGraphics, tBrush *pBrush, I32 x, I32 y, FT_BitmapGlyph pGlyph) { + FT_Bitmap *pBmp = &pGlyph->bitmap; + I32 i, j; + I32 xOrg = x + pGlyph->left; + I32 xPix, yPix = y - pGlyph->top; + unsigned char *pMem = pBmp->buffer; + unsigned char *pMemCol0 = pMem; + U32 bmpStride = pBmp->pitch; + + if (pBmp->pixel_mode == FT_PIXEL_MODE_MONO) { + for (j=0; jrows; j++) { + U8 curByte; + xPix = xOrg; + for (i=0; iwidth; i++) { + U32 col; + U32 bitPos = i & 0x7; + if (bitPos == 0) { + curByte = *pMem++; + } + col = (curByte & (0x80 >> bitPos))?mBrush_GetPixelCol(pBrush, pGraphics, xPix, yPix):0; + mSetPixel(pGraphics, xPix, yPix, col); + xPix++; + } + yPix++; + pMem = pMemCol0 + bmpStride; + pMemCol0 = pMem; + } + } else if (pBmp->pixel_mode == FT_PIXEL_MODE_GRAY) { + for (j = 0; jrows; j++) { + xPix = xOrg; + for (i = 0; iwidth; i++) { + // Calculate the transparency value needed to display this pixel + U32 col; + U32 trans = *pMem++; + col = mBrush_GetPixelCol(pBrush, pGraphics, xPix, yPix); + trans *= col >> 24; + trans /= 255; + col = (col & 0x00ffffff) | (trans << 24); + mSetPixel(pGraphics, xPix, yPix, col); + xPix++; + } + yPix++; + pMem = pMemCol0 + bmpStride; + pMemCol0 = pMem; + } + } +} + +typedef void (*tShowFTBitmap)(tGraphics *pGraphics, tBrush *pBrush, I32 x, I32 y, FT_BitmapGlyph pGlyph); +tShowFTBitmap mShowFTBitmap_[FMT_NUM] = { + ShowFTBitmap_All, + ShowFTBitmap_All +}; +#define mShowFTBitmap(pGraphics, pBrush, x, y, pGlyph) mShowFTBitmap_[pGraphics->pixelFormatIndex](pGraphics, pBrush, x, y, pGlyph) + +static FT_Error FaceReq(FTC_FaceID faceID, FT_Library ftLib, FT_Pointer state, FT_Face *pFace) { + char str[256]; + tFont *pFont = (tFont*)faceID; + + sprintf(str, "%s%s.ttf", FONT_DIR, pFont->pFontFamily->familyName); + + return FT_New_Face(ftLib, str, 0, pFace); +} + +// Make sure that the freetype library is ready for use +static void EnsureFT() { + FT_Error ftErr; + + if (ftLib != NULL) { + // Don't init anything if it's already been done. + return; + } + + // Init the font library + ftErr = FT_Init_FreeType(&ftLib); + FT_CHECKERROR("FT_Init_FreeType()"); + + // Init the cache system + ftErr = FTC_Manager_New(ftLib, 0, 0, 0, FaceReq, NULL, &ftCache); + FT_CHECKERROR("FTC_Manager_New()"); + ftErr = FTC_CMapCache_New(ftCache, &ftCMapCache); + FT_CHECKERROR("FTC_CMapCache_New()"); + ftErr = FTC_ImageCache_New(ftCache, &ftImageCache); + FT_CHECKERROR("FTC_ImageCache_New()"); +} + +void Text_EnsureFontMetrics(tFont *pFont) { + FT_Error ftErr; + char str[256]; + FT_Face face; + + EnsureFT(); + + sprintf(str, "%s%s.ttf", FONT_DIR, pFont->pFontFamily->familyName); + ftErr = FT_New_Face(ftLib, str, 0, &face); + FT_CHECKERROR("FT_New_Face()"); + pFont->ascender = ABS(face->ascender); + pFont->descender = ABS(face->descender); + pFont->unitsPerEm = face->units_per_EM; + pFont->height = face->height; + pFont->maxAdvanceWidth = face->max_advance_width; + pFont->maxAdvanceHeight = face->max_advance_height; + pFont->underlineThickness = face->underline_thickness; + pFont->underlinePosition = face->underline_position; + // Get the index of the unicode char-map. + // This works because the unicode char-map is always selected by default when the font is loaded + pFont->charMapIndex = FT_Get_Charmap_Index(face->charmap); + FT_Done_Face(face); + + pFont->pixelSizeX = PT_TO_PIXEL_X(pFont->emSize); + pFont->pixelSizeY = PT_TO_PIXEL_Y(pFont->emSize); + pFont->pixelAscender = pFont->ascender * pFont->pixelSizeY / pFont->unitsPerEm; + pFont->pixelDescender = pFont->descender * pFont->pixelSizeY / pFont->unitsPerEm; + pFont->pixelHeight = pFont->height * pFont->pixelSizeY / pFont->unitsPerEm; +} + +void Text_RemoveFont(tFont *pFont) { + // A font has been disposed of, so tell the cache system. + FTC_Manager_RemoveFaceID(ftCache, (FTC_FaceID)pFont); +} + +typedef struct tTextLine_ tTextLine; +struct tTextLine_ { + STRING2 startChar; + I32 numChars; + I32 pixelWidth; + tTextLine *pNext; +}; + +#define INIT_LINE(pLine, firstChar) pLine = TMALLOC(tTextLine); pLine->startChar = firstChar; pLine->numChars = 0; pLine->pixelWidth = 0; pLine->pNext = NULL + +void DrawMeasureString(tGraphics *pGraphics, STRING2 s, tFont *pFont, tBrush *pBrush, I32 x1, I32 y1, I32 x2, I32 y2, tStringFormat *pFormat, U32 *pSzWidth, U32 *pSzHeight) { + FT_Error ftErr; + I32 x, y; + I32 width, height; + FTC_ImageTypeRec imageTypeRender, imageTypeOutline; + U8 wrap, lineLimit, rightToLeft, clip; + U32 alignment, lineAlignment; + tTextLine *pFirstLine = NULL, *pCurLine; + STRING2 pText, pPrevWhiteSpace; + U16 c; + U32 glyphIndex; + U32 wasPrevWhiteSpace; + I32 extraPixelWidth, extraNumChars; + I32 numLines; + + EnsureFT(); + + width = (U32)x2-x1; + height = (U32)y2-y1; + + imageTypeOutline.face_id = imageTypeRender.face_id = (FTC_FaceID)pFont; + imageTypeOutline.width = imageTypeRender.width = pFont->pixelSizeX; + imageTypeOutline.height = imageTypeRender.height = pFont->pixelSizeY; + switch (pGraphics->textRenderingHint) { + case TextRenderingHint_SingleBitPerPixelGridFit: + case TextRenderingHint_SingleBitPerPixel: + imageTypeRender.flags = FT_LOAD_RENDER | FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO; + imageTypeOutline.flags = FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO; + break; + default: + imageTypeRender.flags = FT_LOAD_RENDER | FT_LOAD_TARGET_NORMAL; + imageTypeOutline.flags = FT_LOAD_TARGET_NORMAL; + break; + } + + // wrap - should the text wrap at the end of lines + wrap = (pFormat->formatFlags & StringFormatFlags_NoWrap)?0:1; + // lineLimit - true to not show partial lines of text + lineLimit = (pFormat->formatFlags & StringFormatFlags_LineLimit)?1:0; + // rightToLeft - text must be printed right-to-left + rightToLeft = (pFormat->formatFlags & StringFormatFlags_DirectionRightToLeft)?1:0; + // clip - Clip text + clip = (pFormat->formatFlags & StringFormatFlags_NoClip)?0:1; + // alignment - left/right alignment + alignment = pFormat->alignment; + // lineAlignment - up/down alignment + lineAlignment = pFormat->lineAlignment; + + y = y1 + pFont->pixelAscender; + + pText = s; + pPrevWhiteSpace = NULL; + + INIT_LINE(pFirstLine, pText); + pCurLine = pFirstLine; + wasPrevWhiteSpace = 0; + extraPixelWidth = 0; + extraNumChars = 0; + numLines = 1; + + // Calulate the line layout and line pixel widths + while ((c = *pText) != 0) { + FT_Glyph glyph; + U8 isWhiteSpace, isNewLine, isIgnore; + + if (lineLimit) { + if (y + pFont->pixelDescender > y2) { + numLines--; + break; + } + } else { + if (y - pFont->pixelAscender > y2) { + numLines--; + break; + } + } + + isWhiteSpace = + (c == ' '); + isNewLine = + (c == '\n'); + isIgnore = + (c == '\r'); + + if (isIgnore) { + *pText = 0; + pText++; + extraNumChars++; + continue; + } + + glyphIndex = FTC_CMapCache_Lookup(ftCMapCache, (FTC_FaceID)pFont, pFont->charMapIndex, c); + ftErr = FTC_ImageCache_Lookup(ftImageCache, &imageTypeOutline, glyphIndex, &glyph, NULL); + FT_CHECKERROR("FTC_ImageCache_Lookup() layout calculation"); + + if (isWhiteSpace) { + pPrevWhiteSpace = pText; + if (!wasPrevWhiteSpace) { + pCurLine->numChars += extraNumChars; + pCurLine->pixelWidth += extraPixelWidth; + extraNumChars = 0; + extraPixelWidth = 0; + } + } else { + if (isNewLine) { + pText++; + pCurLine->numChars += extraNumChars; + pCurLine->pixelWidth += extraPixelWidth; + INIT_LINE(pCurLine->pNext, pText); + } else if (pCurLine->pixelWidth + extraPixelWidth + (glyph->advance.x >> 16) > width && + pCurLine->numChars > 0) { + // Create new line (but only if there's already at least 1 character in this line) + if (pPrevWhiteSpace == NULL) { + // No white-space yet, so just split here + pCurLine->numChars += extraNumChars; + pCurLine->pixelWidth += extraPixelWidth; + INIT_LINE(pCurLine->pNext, pText); + } else { + // Split after previous white-space + INIT_LINE(pCurLine->pNext, pPrevWhiteSpace+1); + pText = pPrevWhiteSpace + 1; + pPrevWhiteSpace = NULL; + } + isNewLine = 1; + } + if (isNewLine) { + pCurLine = pCurLine->pNext; + extraNumChars = 0; + extraPixelWidth = 0; + y += pFont->pixelHeight; + numLines++; + continue; + } + } + + extraNumChars++; + extraPixelWidth += glyph->advance.x >> 16; + + pText++; + wasPrevWhiteSpace = isWhiteSpace; + } + pCurLine->numChars += extraNumChars; + pCurLine->pixelWidth += extraPixelWidth; + + // If only measuring string, then calculate results, otherwise render string + if (pBrush == NULL) { + + U32 maxWidth = 0; + U32 height = 0; + + pCurLine = pFirstLine; + while (pCurLine != NULL) { + if (pCurLine->pixelWidth > (I32)maxWidth) { + maxWidth = pCurLine->pixelWidth; + } + height += pFont->pixelHeight; + pCurLine = pCurLine->pNext; + } + + *pSzWidth = maxWidth; + *pSzHeight = height; + + } else { + + // Render all the lines of text + switch (lineAlignment) { + case StringAlignment_Far: + y = y2 - numLines * pFont->pixelHeight; + break; + case StringAlignment_Center: + y = y1 + ((height - numLines * pFont->pixelHeight) >> 1); + break; + default: + y = y1; + break; + } + y += pFont->pixelAscender; + pCurLine = pFirstLine; + while (pCurLine != NULL) { + U32 i; + pText = pCurLine->startChar; + switch (alignment) { + case StringAlignment_Far: + x = (rightToLeft)?(x1+pCurLine->pixelWidth):(x2-pCurLine->pixelWidth); + break; + case StringAlignment_Center: + x = (rightToLeft)?(x2 - ((width - pCurLine->pixelWidth) >> 1)):(x1 + ((width - pCurLine->pixelWidth) >> 1)); + break; + default: + x = (rightToLeft)?x2:x1; + break; + } + for (i=pCurLine->numChars; i>0; i--, pText++) { + FT_BitmapGlyph glyph; + if (*pText == 0) { + // All 'ignore' characters are set to 0 + continue; + } + glyphIndex = FTC_CMapCache_Lookup(ftCMapCache, (FTC_FaceID)pFont, pFont->charMapIndex, *pText); + ftErr = FTC_ImageCache_Lookup(ftImageCache, &imageTypeRender, glyphIndex, (FT_Glyph*)&glyph, NULL); + FT_CHECKERROR("FTC_ImageCache_Lookup() rendering"); + if (rightToLeft) { + x -= glyph->root.advance.x >> 16; + } + mShowFTBitmap(pGraphics, pBrush, x, y, glyph); + if (!rightToLeft) { + x += glyph->root.advance.x >> 16; + } + } + y += pFont->pixelHeight; + pCurLine = pCurLine->pNext; + } + } + + // Free line structures + while (pFirstLine != NULL) { + pCurLine = pFirstLine->pNext; + free(pFirstLine); + pFirstLine = pCurLine; + } +} + +void MeasureString_(tGraphics *pGraphics, STRING2 s, tFont *pFont, I32 width, tStringFormat *pFormat, U32 *pSzWidth, U32 *pSzHeight) { + DrawMeasureString(pGraphics, s, pFont, NULL, 0, 0, width, 0x7fffffff, pFormat, pSzWidth, pSzHeight); +} + +void DrawString_(tGraphics *pGraphics, STRING2 s, tFont *pFont, tBrush *pBrush, I32 x1, I32 y1, I32 x2, I32 y2, tStringFormat *pFormat) { + DrawMeasureString(pGraphics, s, pFont, pBrush, x1, y1, x2, y2, pFormat, NULL, NULL); +} + +#else + +void Text_EnsureFontMetrics(tFont *pFont) { + // Do nothing +} + +void Text_RemoveFont(tFont *pFont) { + // Do nothing +} + +void DrawString_(tGraphics *pGraphics, STRING2 s, tFont *pFont, tBrush *pBrush, I32 x1, I32 y1, I32 x2, I32 y2, tStringFormat *pFormat) { + // Do nothing +} + +void MeasureString_(tGraphics *pGraphics, STRING2 s, tFont *pFont, I32 width, tStringFormat *pFormat, U32 *pSzWidth, U32 *pSzHeight) { + *pSzWidth = 0; + *pSzHeight = 0; + // Do nothing +} + +#endif diff --git a/libIGraph/Text.h b/libIGraph/Text.h new file mode 100644 index 0000000..5e250ed --- /dev/null +++ b/libIGraph/Text.h @@ -0,0 +1,43 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __TEXT_H +#define __TEXT_H + +#include "libIGraph.h" + +#include "Graphics.h" +#include "Brush.h" +#include "Font.h" +#include "StringFormat.h" + +#define FontStyle_Regular 0 +#define FontStyle_Bold 1 +#define FontStyle_Italic 2 +#define FontStyle_Underline 4 +#define FontStyle_Strikeout 5 + +void Text_EnsureFontMetrics(tFont *pFont); +void Text_RemoveFont(tFont *pFont); + +void MeasureString_(tGraphics *pGraphics, STRING2 s, tFont *pFont, I32 width, tStringFormat *pFormat, U32 *pSzWidth, U32 *pSzHeight); +void DrawString_(tGraphics *pGraphics, STRING2 s, tFont *pFont, tBrush *pBrush, I32 x1, I32 y1, I32 x2, I32 y2, tStringFormat *pFormat); + +#endif diff --git a/libIGraph/freetype.dll b/libIGraph/freetype.dll new file mode 100644 index 0000000..681e8ee --- /dev/null +++ b/libIGraph/freetype.dll Binary files differ diff --git a/libIGraph/freetype.txt b/libIGraph/freetype.txt new file mode 100644 index 0000000..caaa8c4 --- /dev/null +++ b/libIGraph/freetype.txt @@ -0,0 +1 @@ +Currently using freetype version 2.3.5 \ No newline at end of file diff --git a/libIGraph/include/freetype/config/ftconfig.h b/libIGraph/include/freetype/config/ftconfig.h new file mode 100644 index 0000000..1547f5a --- /dev/null +++ b/libIGraph/include/freetype/config/ftconfig.h @@ -0,0 +1,363 @@ +/***************************************************************************/ +/* */ +/* ftconfig.h */ +/* */ +/* ANSI-specific configuration file (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This header file contains a number of macro definitions that are used */ + /* by the rest of the engine. Most of the macros here are automatically */ + /* determined at compile time, and you should not need to change it to */ + /* port FreeType, except to compile the library with a non-ANSI */ + /* compiler. */ + /* */ + /* Note however that if some specific modifications are needed, we */ + /* advise you to place a modified copy in your build directory. */ + /* */ + /* The build directory is usually `freetype/builds/', and */ + /* contains system-specific files that are always included first when */ + /* building the library. */ + /* */ + /* This ANSI version should stay in `include/freetype/config'. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTCONFIG_H__ +#define __FTCONFIG_H__ + +#include +#include FT_CONFIG_OPTIONS_H +#include FT_CONFIG_STANDARD_LIBRARY_H + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* PLATFORM-SPECIFIC CONFIGURATION MACROS */ + /* */ + /* These macros can be toggled to suit a specific system. The current */ + /* ones are defaults used to compile FreeType in an ANSI C environment */ + /* (16bit compilers are also supported). Copy this file to your own */ + /* `freetype/builds/' directory, and edit it to port the engine. */ + /* */ + /*************************************************************************/ + + + /* There are systems (like the Texas Instruments 'C54x) where a `char' */ + /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */ + /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */ + /* is probably unexpected. */ + /* */ + /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */ + /* `char' type. */ + +#ifndef FT_CHAR_BIT +#define FT_CHAR_BIT CHAR_BIT +#endif + + + /* The size of an `int' type. */ +#if FT_UINT_MAX == 0xFFFFUL +#define FT_SIZEOF_INT (16 / FT_CHAR_BIT) +#elif FT_UINT_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_INT (32 / FT_CHAR_BIT) +#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_INT (64 / FT_CHAR_BIT) +#else +#error "Unsupported size of `int' type!" +#endif + + /* The size of a `long' type. A five-byte `long' (as used e.g. on the */ + /* DM642) is recognized but avoided. */ +#if FT_ULONG_MAX == 0xFFFFFFFFUL +#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL +#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT) +#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL +#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT) +#else +#error "Unsupported size of `long' type!" +#endif + + + /* Preferred alignment of data */ +#define FT_ALIGNMENT 8 + + + /* FT_UNUSED is a macro used to indicate that a given parameter is not */ + /* used -- this is only used to get rid of unpleasant compiler warnings */ +#ifndef FT_UNUSED +#define FT_UNUSED( arg ) ( (arg) = (arg) ) +#endif + + + /*************************************************************************/ + /* */ + /* AUTOMATIC CONFIGURATION MACROS */ + /* */ + /* These macros are computed from the ones defined above. Don't touch */ + /* their definition, unless you know precisely what you are doing. No */ + /* porter should need to mess with them. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Mac support */ + /* */ + /* This is the only necessary change, so it is defined here instead */ + /* providing a new configuration file. */ + /* */ +#if ( defined( __APPLE__ ) && !defined( DARWIN_NO_CARBON ) ) || \ + ( defined( __MWERKS__ ) && defined( macintosh ) ) + /* no Carbon frameworks for 64bit 10.4.x */ +#include "AvailabilityMacros.h" +#if defined( __LP64__ ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 ) +#define DARWIN_NO_CARBON 1 +#else +#define FT_MACINTOSH 1 +#endif +#endif + + + /*************************************************************************/ + /* */ + /* IntN types */ + /* */ + /* Used to guarantee the size of some specific integers. */ + /* */ + typedef signed short FT_Int16; + typedef unsigned short FT_UInt16; + +#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT) + + typedef signed int FT_Int32; + typedef unsigned int FT_UInt32; + +#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT) + + typedef signed long FT_Int32; + typedef unsigned long FT_UInt32; + +#else +#error "no 32bit type found -- please check your configuration files" +#endif + + /* look up an integer type that is at least 32 bits */ +#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT) + + typedef int FT_Fast; + typedef unsigned int FT_UFast; + +#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT) + + typedef long FT_Fast; + typedef unsigned long FT_UFast; + +#endif + + + /* determine whether we have a 64-bit int type for platforms without */ + /* Autoconf */ +#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) + + /* FT_LONG64 must be defined if a 64-bit type is available */ +#define FT_LONG64 +#define FT_INT64 long + +#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __BORLANDC__ ) /* Borland C++ */ + + /* XXXX: We should probably check the value of __BORLANDC__ in order */ + /* to test the compiler version. */ + + /* this compiler provides the __int64 type */ +#define FT_LONG64 +#define FT_INT64 __int64 + +#elif defined( __WATCOMC__ ) /* Watcom C++ */ + + /* Watcom doesn't provide 64-bit data types */ + +#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */ + +#define FT_LONG64 +#define FT_INT64 long long int + +#elif defined( __GNUC__ ) + + /* GCC provides the `long long' type */ +#define FT_LONG64 +#define FT_INT64 long long int + +#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */ + + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) +#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT + + + /*************************************************************************/ + /* */ + /* A 64-bit data type will create compilation problems if you compile */ + /* in strict ANSI mode. To avoid them, we disable their use if */ + /* __STDC__ is defined. You can however ignore this rule by */ + /* defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */ + /* */ +#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 ) + +#ifdef __STDC__ + + /* undefine the 64-bit macros in strict ANSI compilation mode */ +#undef FT_LONG64 +#undef FT_INT64 + +#endif /* __STDC__ */ + +#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */ + + +#ifdef FT_MAKE_OPTION_SINGLE_OBJECT + +#define FT_LOCAL( x ) static x +#define FT_LOCAL_DEF( x ) static x + +#else + +#ifdef __cplusplus +#define FT_LOCAL( x ) extern "C" x +#define FT_LOCAL_DEF( x ) extern "C" x +#else +#define FT_LOCAL( x ) extern x +#define FT_LOCAL_DEF( x ) x +#endif + +#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */ + + +#ifndef FT_BASE + +#ifdef __cplusplus +#define FT_BASE( x ) extern "C" x +#else +#define FT_BASE( x ) extern x +#endif + +#endif /* !FT_BASE */ + + +#ifndef FT_BASE_DEF + +#ifdef __cplusplus +#define FT_BASE_DEF( x ) x +#else +#define FT_BASE_DEF( x ) x +#endif + +#endif /* !FT_BASE_DEF */ + + +#ifndef FT_EXPORT + +#ifdef __cplusplus +#define FT_EXPORT( x ) extern "C" x +#else +#define FT_EXPORT( x ) extern x +#endif + +#endif /* !FT_EXPORT */ + + +#ifndef FT_EXPORT_DEF + +#ifdef __cplusplus +#define FT_EXPORT_DEF( x ) extern "C" x +#else +#define FT_EXPORT_DEF( x ) extern x +#endif + +#endif /* !FT_EXPORT_DEF */ + + +#ifndef FT_EXPORT_VAR + +#ifdef __cplusplus +#define FT_EXPORT_VAR( x ) extern "C" x +#else +#define FT_EXPORT_VAR( x ) extern x +#endif + +#endif /* !FT_EXPORT_VAR */ + + /* The following macros are needed to compile the library with a */ + /* C++ compiler and with 16bit compilers. */ + /* */ + + /* This is special. Within C++, you must specify `extern "C"' for */ + /* functions which are used via function pointers, and you also */ + /* must do that for structures which contain function pointers to */ + /* assure C linkage -- it's not possible to have (local) anonymous */ + /* functions which are accessed by (global) function pointers. */ + /* */ + /* */ + /* FT_CALLBACK_DEF is used to _define_ a callback function. */ + /* */ + /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */ + /* contains pointers to callback functions. */ + /* */ + /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */ + /* that contains pointers to callback functions. */ + /* */ + /* */ + /* Some 16bit compilers have to redefine these macros to insert */ + /* the infamous `_cdecl' or `__fastcall' declarations. */ + /* */ +#ifndef FT_CALLBACK_DEF +#ifdef __cplusplus +#define FT_CALLBACK_DEF( x ) extern "C" x +#else +#define FT_CALLBACK_DEF( x ) static x +#endif +#endif /* FT_CALLBACK_DEF */ + +#ifndef FT_CALLBACK_TABLE +#ifdef __cplusplus +#define FT_CALLBACK_TABLE extern "C" +#define FT_CALLBACK_TABLE_DEF extern "C" +#else +#define FT_CALLBACK_TABLE extern +#define FT_CALLBACK_TABLE_DEF /* nothing */ +#endif +#endif /* FT_CALLBACK_TABLE */ + + +FT_END_HEADER + + +#endif /* __FTCONFIG_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/config/ftheader.h b/libIGraph/include/freetype/config/ftheader.h new file mode 100644 index 0000000..b957d05 --- /dev/null +++ b/libIGraph/include/freetype/config/ftheader.h @@ -0,0 +1,729 @@ +/***************************************************************************/ +/* */ +/* ftheader.h */ +/* */ +/* Build macros of the FreeType 2 library. */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + +#ifndef __FT_HEADER_H__ +#define __FT_HEADER_H__ + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_BEGIN_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_END_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }' block when included from a */ + /* C++ compiler. */ + /* */ +#ifdef __cplusplus +#define FT_BEGIN_HEADER extern "C" { +#else +#define FT_BEGIN_HEADER /* nothing */ +#endif + + + /*@***********************************************************************/ + /* */ + /* */ + /* FT_END_HEADER */ + /* */ + /* */ + /* This macro is used in association with @FT_BEGIN_HEADER in header */ + /* files to ensure that the declarations within are properly */ + /* encapsulated in an `extern "C" { .. }' block when included from a */ + /* C++ compiler. */ + /* */ +#ifdef __cplusplus +#define FT_END_HEADER } +#else +#define FT_END_HEADER /* nothing */ +#endif + + + /*************************************************************************/ + /* */ + /* Aliases for the FreeType 2 public and configuration files. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /*
*/ + /* header_file_macros */ + /* */ + /* */ + /* Header File Macros */ + /* */ + /* <Abstract> */ + /* Macro definitions used to #include specific header files. */ + /* */ + /* <Description> */ + /* The following macros are defined to the name of specific */ + /* FreeType 2 header files. They can be used directly in #include */ + /* statements as in: */ + /* */ + /* { */ + /* #include FT_FREETYPE_H */ + /* #include FT_MULTIPLE_MASTERS_H */ + /* #include FT_GLYPH_H */ + /* } */ + /* */ + /* There are several reasons why we are now using macros to name */ + /* public header files. The first one is that such macros are not */ + /* limited to the infamous 8.3 naming rule required by DOS (and */ + /* `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h'). */ + /* */ + /* The second reason is that it allows for more flexibility in the */ + /* way FreeType 2 is installed on a given system. */ + /* */ + /*************************************************************************/ + + + /* configuration files */ + + /************************************************************************* + * + * @macro: + * FT_CONFIG_CONFIG_H + * + * @description: + * A macro used in #include statements to name the file containing + * FreeType 2 configuration data. + * + */ +#ifndef FT_CONFIG_CONFIG_H +#define FT_CONFIG_CONFIG_H <freetype/config/ftconfig.h> +#endif + + + /************************************************************************* + * + * @macro: + * FT_CONFIG_STANDARD_LIBRARY_H + * + * @description: + * A macro used in #include statements to name the file containing + * FreeType 2 interface to the standard C library functions. + * + */ +#ifndef FT_CONFIG_STANDARD_LIBRARY_H +#define FT_CONFIG_STANDARD_LIBRARY_H <freetype/config/ftstdlib.h> +#endif + + + /************************************************************************* + * + * @macro: + * FT_CONFIG_OPTIONS_H + * + * @description: + * A macro used in #include statements to name the file containing + * FreeType 2 project-specific configuration options. + * + */ +#ifndef FT_CONFIG_OPTIONS_H +#define FT_CONFIG_OPTIONS_H <freetype/config/ftoption.h> +#endif + + + /************************************************************************* + * + * @macro: + * FT_CONFIG_MODULES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list of FreeType 2 modules that are statically linked to new library + * instances in @FT_Init_FreeType. + * + */ +#ifndef FT_CONFIG_MODULES_H +#define FT_CONFIG_MODULES_H <freetype/config/ftmodule.h> +#endif + + + /* public headers */ + + /************************************************************************* + * + * @macro: + * FT_FREETYPE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * base FreeType 2 API. + * + */ +#define FT_FREETYPE_H <freetype/freetype.h> + + + /************************************************************************* + * + * @macro: + * FT_ERRORS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list of FreeType 2 error codes (and messages). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_ERRORS_H <freetype/fterrors.h> + + + /************************************************************************* + * + * @macro: + * FT_MODULE_ERRORS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list of FreeType 2 module error offsets (and messages). + * + */ +#define FT_MODULE_ERRORS_H <freetype/ftmoderr.h> + + + /************************************************************************* + * + * @macro: + * FT_SYSTEM_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType 2 interface to low-level operations (i.e., memory management + * and stream i/o). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_SYSTEM_H <freetype/ftsystem.h> + + + /************************************************************************* + * + * @macro: + * FT_IMAGE_H + * + * @description: + * A macro used in #include statements to name the file containing type + * definitions related to glyph images (i.e., bitmaps, outlines, + * scan-converter parameters). + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_IMAGE_H <freetype/ftimage.h> + + + /************************************************************************* + * + * @macro: + * FT_TYPES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * basic data types defined by FreeType 2. + * + * It is included by @FT_FREETYPE_H. + * + */ +#define FT_TYPES_H <freetype/fttypes.h> + + + /************************************************************************* + * + * @macro: + * FT_LIST_H + * + * @description: + * A macro used in #include statements to name the file containing the + * list management API of FreeType 2. + * + * (Most applications will never need to include this file.) + * + */ +#define FT_LIST_H <freetype/ftlist.h> + + + /************************************************************************* + * + * @macro: + * FT_OUTLINE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * scalable outline management API of FreeType 2. + * + */ +#define FT_OUTLINE_H <freetype/ftoutln.h> + + + /************************************************************************* + * + * @macro: + * FT_SIZES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API which manages multiple @FT_Size objects per face. + * + */ +#define FT_SIZES_H <freetype/ftsizes.h> + + + /************************************************************************* + * + * @macro: + * FT_MODULE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * module management API of FreeType 2. + * + */ +#define FT_MODULE_H <freetype/ftmodapi.h> + + + /************************************************************************* + * + * @macro: + * FT_RENDER_H + * + * @description: + * A macro used in #include statements to name the file containing the + * renderer module management API of FreeType 2. + * + */ +#define FT_RENDER_H <freetype/ftrender.h> + + + /************************************************************************* + * + * @macro: + * FT_TYPE1_TABLES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * types and API specific to the Type 1 format. + * + */ +#define FT_TYPE1_TABLES_H <freetype/t1tables.h> + + + /************************************************************************* + * + * @macro: + * FT_TRUETYPE_IDS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * enumeration values which identify name strings, languages, encodings, + * etc. This file really contains a _large_ set of constant macro + * definitions, taken from the TrueType and OpenType specifications. + * + */ +#define FT_TRUETYPE_IDS_H <freetype/ttnameid.h> + + + /************************************************************************* + * + * @macro: + * FT_TRUETYPE_TABLES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * types and API specific to the TrueType (as well as OpenType) format. + * + */ +#define FT_TRUETYPE_TABLES_H <freetype/tttables.h> + + + /************************************************************************* + * + * @macro: + * FT_TRUETYPE_TAGS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of TrueType four-byte `tags' which identify blocks in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_TRUETYPE_TAGS_H <freetype/tttags.h> + + + /************************************************************************* + * + * @macro: + * FT_BDF_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which accesses BDF-specific strings from a + * face. + * + */ +#define FT_BDF_H <freetype/ftbdf.h> + + + /************************************************************************* + * + * @macro: + * FT_GZIP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which supports gzip-compressed files. + * + */ +#define FT_GZIP_H <freetype/ftgzip.h> + + + /************************************************************************* + * + * @macro: + * FT_LZW_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which supports LZW-compressed files. + * + */ +#define FT_LZW_H <freetype/ftlzw.h> + + + /************************************************************************* + * + * @macro: + * FT_WINFONTS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * definitions of an API which supports Windows FNT files. + * + */ +#define FT_WINFONTS_H <freetype/ftwinfnt.h> + + + /************************************************************************* + * + * @macro: + * FT_GLYPH_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional glyph management component. + * + */ +#define FT_GLYPH_H <freetype/ftglyph.h> + + + /************************************************************************* + * + * @macro: + * FT_BITMAP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional bitmap conversion component. + * + */ +#define FT_BITMAP_H <freetype/ftbitmap.h> + + + /************************************************************************* + * + * @macro: + * FT_BBOX_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional exact bounding box computation routines. + * + */ +#define FT_BBOX_H <freetype/ftbbox.h> + + + /************************************************************************* + * + * @macro: + * FT_CACHE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * API of the optional FreeType 2 cache sub-system. + * + */ +#define FT_CACHE_H <freetype/ftcache.h> + + + /************************************************************************* + * + * @macro: + * FT_CACHE_IMAGE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * `glyph image' API of the FreeType 2 cache sub-system. + * + * It is used to define a cache for @FT_Glyph elements. You can also + * use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to + * store small glyph bitmaps, as it will use less memory. + * + * This macro is deprecated. Simply include @FT_CACHE_H to have all + * glyph image-related cache declarations. + * + */ +#define FT_CACHE_IMAGE_H FT_CACHE_H + + + /************************************************************************* + * + * @macro: + * FT_CACHE_SMALL_BITMAPS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * `small bitmaps' API of the FreeType 2 cache sub-system. + * + * It is used to define a cache for small glyph bitmaps in a relatively + * memory-efficient way. You can also use the API defined in + * @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images, + * including scalable outlines. + * + * This macro is deprecated. Simply include @FT_CACHE_H to have all + * small bitmaps-related cache declarations. + * + */ +#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H + + + /************************************************************************* + * + * @macro: + * FT_CACHE_CHARMAP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * `charmap' API of the FreeType 2 cache sub-system. + * + * This macro is deprecated. Simply include @FT_CACHE_H to have all + * charmap-based cache declarations. + * + */ +#define FT_CACHE_CHARMAP_H FT_CACHE_H + + + /************************************************************************* + * + * @macro: + * FT_MAC_H + * + * @description: + * A macro used in #include statements to name the file containing the + * Macintosh-specific FreeType 2 API. The latter is used to access + * fonts embedded in resource forks. + * + * This header file must be explicitly included by client applications + * compiled on the Mac (note that the base API still works though). + * + */ +#define FT_MAC_H <freetype/ftmac.h> + + + /************************************************************************* + * + * @macro: + * FT_MULTIPLE_MASTERS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional multiple-masters management API of FreeType 2. + * + */ +#define FT_MULTIPLE_MASTERS_H <freetype/ftmm.h> + + + /************************************************************************* + * + * @macro: + * FT_SFNT_NAMES_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional FreeType 2 API which accesses embedded `name' strings in + * SFNT-based font formats (i.e., TrueType and OpenType). + * + */ +#define FT_SFNT_NAMES_H <freetype/ftsnames.h> + + + /************************************************************************* + * + * @macro: + * FT_OPENTYPE_VALIDATE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional FreeType 2 API which validates OpenType tables (BASE, GDEF, + * GPOS, GSUB, JSTF). + * + */ +#define FT_OPENTYPE_VALIDATE_H <freetype/ftotval.h> + + + /************************************************************************* + * + * @macro: + * FT_GX_VALIDATE_H + * + * @description: + * A macro used in #include statements to name the file containing the + * optional FreeType 2 API which validates TrueTypeGX/AAT tables (feat, + * mort, morx, bsln, just, kern, opbd, trak, prop). + * + */ +#define FT_GX_VALIDATE_H <freetype/ftgxval.h> + + + /************************************************************************* + * + * @macro: + * FT_PFR_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType 2 API which accesses PFR-specific data. + * + */ +#define FT_PFR_H <freetype/ftpfr.h> + + + /************************************************************************* + * + * @macro: + * FT_STROKER_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType 2 API which provides functions to stroke outline paths. + */ +#define FT_STROKER_H <freetype/ftstroke.h> + + + /************************************************************************* + * + * @macro: + * FT_SYNTHESIS_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType 2 API which performs artificial obliquing and emboldening. + */ +#define FT_SYNTHESIS_H <freetype/ftsynth.h> + + + /************************************************************************* + * + * @macro: + * FT_XFREE86_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType 2 API which provides functions specific to the XFree86 and + * X.Org X11 servers. + */ +#define FT_XFREE86_H <freetype/ftxf86.h> + + + /************************************************************************* + * + * @macro: + * FT_TRIGONOMETRY_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType 2 API which performs trigonometric computations (e.g., + * cosines and arc tangents). + */ +#define FT_TRIGONOMETRY_H <freetype/fttrigon.h> + + + /************************************************************************* + * + * @macro: + * FT_LCD_FILTER_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType 2 API which performs color filtering for subpixel rendering. + */ +#define FT_LCD_FILTER_H <freetype/ftlcdfil.h> + + + /************************************************************************* + * + * @macro: + * FT_GASP_H + * + * @description: + * A macro used in #include statements to name the file containing the + * FreeType 2 API which returns entries from the TrueType GASP table. + */ +#define FT_GASP_H <freetype/ftgasp.h> + + + /* */ + +#define FT_ERROR_DEFINITIONS_H <freetype/fterrdef.h> + + + /* The internals of the cache sub-system are no longer exposed. We */ + /* default to FT_CACHE_H at the moment just in case, but we know of */ + /* no rogue client that uses them. */ + /* */ +#define FT_CACHE_MANAGER_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_MRU_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_MANAGER_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_CACHE_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_GLYPH_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_IMAGE_H <freetype/ftcache.h> +#define FT_CACHE_INTERNAL_SBITS_H <freetype/ftcache.h> + + +#define FT_INCREMENTAL_H <freetype/ftincrem.h> + +#define FT_TRUETYPE_UNPATENTED_H <freetype/ttunpat.h> + + + /* + * Include internal headers definitions from <freetype/internal/...> + * only when building the library. + */ +#ifdef FT2_BUILD_LIBRARY +#define FT_INTERNAL_INTERNAL_H <freetype/internal/internal.h> +#include FT_INTERNAL_INTERNAL_H +#endif /* FT2_BUILD_LIBRARY */ + + +#endif /* __FT2_BUILD_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/config/ftmodule.h b/libIGraph/include/freetype/config/ftmodule.h new file mode 100644 index 0000000..d92b0ee --- /dev/null +++ b/libIGraph/include/freetype/config/ftmodule.h @@ -0,0 +1,32 @@ +/* + * This file registers the FreeType modules compiled into the library. + * + * If you use GNU make, this file IS NOT USED! Instead, it is created in + * the objects directory (normally `<topdir>/objs/') based on information + * from `<topdir>/modules.cfg'. + * + * Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile + * FreeType without GNU make. + * + */ + +FT_USE_MODULE(autofit_module_class) +FT_USE_MODULE(tt_driver_class) +FT_USE_MODULE(t1_driver_class) +FT_USE_MODULE(cff_driver_class) +FT_USE_MODULE(t1cid_driver_class) +FT_USE_MODULE(pfr_driver_class) +FT_USE_MODULE(t42_driver_class) +FT_USE_MODULE(winfnt_driver_class) +FT_USE_MODULE(pcf_driver_class) +FT_USE_MODULE(psaux_module_class) +FT_USE_MODULE(psnames_module_class) +FT_USE_MODULE(pshinter_module_class) +FT_USE_MODULE(ft_raster1_renderer_class) +FT_USE_MODULE(sfnt_module_class) +FT_USE_MODULE(ft_smooth_renderer_class) +FT_USE_MODULE(ft_smooth_lcd_renderer_class) +FT_USE_MODULE(ft_smooth_lcdv_renderer_class) +FT_USE_MODULE(bdf_driver_class) + +/* EOF */ diff --git a/libIGraph/include/freetype/config/ftoption.h b/libIGraph/include/freetype/config/ftoption.h new file mode 100644 index 0000000..532848d --- /dev/null +++ b/libIGraph/include/freetype/config/ftoption.h @@ -0,0 +1,669 @@ +/***************************************************************************/ +/* */ +/* ftoption.h */ +/* */ +/* User-selectable configuration macros (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOPTION_H__ +#define __FTOPTION_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* USER-SELECTABLE CONFIGURATION MACROS */ + /* */ + /* This file contains the default configuration macro definitions for */ + /* a standard build of the FreeType library. There are three ways to */ + /* use this file to build project-specific versions of the library: */ + /* */ + /* - You can modify this file by hand, but this is not recommended in */ + /* cases where you would like to build several versions of the */ + /* library from a single source directory. */ + /* */ + /* - You can put a copy of this file in your build directory, more */ + /* precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD' */ + /* is the name of a directory that is included _before_ the FreeType */ + /* include path during compilation. */ + /* */ + /* The default FreeType Makefiles and Jamfiles use the build */ + /* directory `builds/<system>' by default, but you can easily change */ + /* that for your own projects. */ + /* */ + /* - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it */ + /* slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to */ + /* locate this file during the build. For example, */ + /* */ + /* #define FT_CONFIG_OPTIONS_H <myftoptions.h> */ + /* #include <freetype/config/ftheader.h> */ + /* */ + /* will use `$BUILD/myftoptions.h' instead of this file for macro */ + /* definitions. */ + /* */ + /* Note also that you can similarly pre-define the macro */ + /* FT_CONFIG_MODULES_H used to locate the file listing of the modules */ + /* that are statically linked to the library at compile time. By */ + /* default, this file is <freetype/config/ftmodule.h>. */ + /* */ + /* We highly recommend using the third method whenever possible. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Uncomment the line below if you want to activate sub-pixel rendering */ + /* (a.k.a. LCD rendering, or ClearType) in this build of the library. */ + /* */ + /* Note that this feature is covered by several Microsoft patents */ + /* and should not be activated in any default build of the library. */ + /* */ + /* This macro has no impact on the FreeType API, only on its */ + /* _implementation_. For example, using FT_RENDER_MODE_LCD when calling */ + /* FT_Render_Glyph still generates a bitmap that is 3 times larger than */ + /* the original size; the difference will be that each triplet of */ + /* subpixels has R=G=B. */ + /* */ + /* This is done to allow FreeType clients to run unmodified, forcing */ + /* them to display normal gray-level anti-aliased glyphs. */ + /* */ +/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + + /*************************************************************************/ + /* */ + /* Many compilers provide a non-ANSI 64-bit data type that can be used */ + /* by FreeType to speed up some computations. However, this will create */ + /* some problems when compiling the library in strict ANSI mode. */ + /* */ + /* For this reason, the use of 64-bit integers is normally disabled when */ + /* the __STDC__ macro is defined. You can however disable this by */ + /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here. */ + /* */ + /* For most compilers, this will only create compilation warnings when */ + /* building the library. */ + /* */ + /* ObNote: The compiler-specific 64-bit integers are detected in the */ + /* file `ftconfig.h' either statically or through the */ + /* `configure' script on supported platforms. */ + /* */ +#undef FT_CONFIG_OPTION_FORCE_INT64 + + + /*************************************************************************/ + /* */ + /* LZW-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `compress' program. This is mostly used to parse many of the PCF */ + /* files that come with various X11 distributions. The implementation */ + /* uses NetBSD's `zopen' to partially uncompress the file on the fly */ + /* (see src/lzw/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. */ + /* */ +#define FT_CONFIG_OPTION_USE_LZW + + + /*************************************************************************/ + /* */ + /* Gzip-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `gzip' program. This is mostly used to parse many of the PCF files */ + /* that come with XFree86. The implementation uses `zlib' to */ + /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. See also */ + /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ + /* */ +#define FT_CONFIG_OPTION_USE_ZLIB + + + /*************************************************************************/ + /* */ + /* ZLib library selection */ + /* */ + /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */ + /* It allows FreeType's `ftgzip' component to link to the system's */ + /* installation of the ZLib library. This is useful on systems like */ + /* Unix or VMS where it generally is already available. */ + /* */ + /* If you let it undefined, the component will use its own copy */ + /* of the zlib sources instead. These have been modified to be */ + /* included directly within the component and *not* export external */ + /* function names. This allows you to link any program with FreeType */ + /* _and_ ZLib without linking conflicts. */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ +/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + + /*************************************************************************/ + /* */ + /* DLL export compilation */ + /* */ + /* When compiling FreeType as a DLL, some systems/compilers need a */ + /* special keyword in front OR after the return type of function */ + /* declarations. */ + /* */ + /* Two macros are used within the FreeType source code to define */ + /* exported library functions: FT_EXPORT and FT_EXPORT_DEF. */ + /* */ + /* FT_EXPORT( return_type ) */ + /* */ + /* is used in a function declaration, as in */ + /* */ + /* FT_EXPORT( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ); */ + /* */ + /* */ + /* FT_EXPORT_DEF( return_type ) */ + /* */ + /* is used in a function definition, as in */ + /* */ + /* FT_EXPORT_DEF( FT_Error ) */ + /* FT_Init_FreeType( FT_Library* alibrary ) */ + /* { */ + /* ... some code ... */ + /* return FT_Err_Ok; */ + /* } */ + /* */ + /* You can provide your own implementation of FT_EXPORT and */ + /* FT_EXPORT_DEF here if you want. If you leave them undefined, they */ + /* will be later automatically defined as `extern return_type' to */ + /* allow normal compilation. */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +/* #define FT_EXPORT(x) extern x */ +/* #define FT_EXPORT_DEF(x) x */ + + + /*************************************************************************/ + /* */ + /* Glyph Postscript Names handling */ + /* */ + /* By default, FreeType 2 is compiled with the `PSNames' module. This */ + /* module is in charge of converting a glyph name string into a */ + /* Unicode value, or return a Macintosh standard glyph name for the */ + /* use with the TrueType `post' table. */ + /* */ + /* Undefine this macro if you do not want `PSNames' compiled in your */ + /* build of FreeType. This has the following effects: */ + /* */ + /* - The TrueType driver will provide its own set of glyph names, */ + /* if you build it to support postscript names in the TrueType */ + /* `post' table. */ + /* */ + /* - The Type 1 driver will not be able to synthetize a Unicode */ + /* charmap out of the glyphs found in the fonts. */ + /* */ + /* You would normally undefine this configuration macro when building */ + /* a version of FreeType that doesn't contain a Type 1 or CFF driver. */ + /* */ +#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Postscript Names to Unicode Values support */ + /* */ + /* By default, FreeType 2 is built with the `PSNames' module compiled */ + /* in. Among other things, the module is used to convert a glyph name */ + /* into a Unicode value. This is especially useful in order to */ + /* synthetize on the fly a Unicode charmap from the CFF/Type 1 driver */ + /* through a big table named the `Adobe Glyph List' (AGL). */ + /* */ + /* Undefine this macro if you do not want the Adobe Glyph List */ + /* compiled in your `PSNames' module. The Type 1 driver will not be */ + /* able to synthetize a Unicode charmap out of the glyphs found in the */ + /* fonts. */ + /* */ +#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + + /*************************************************************************/ + /* */ + /* Support for Mac fonts */ + /* */ + /* Define this macro if you want support for outline fonts in Mac */ + /* format (mac dfont, mac resource, macbinary containing a mac */ + /* resource) on non-Mac platforms. */ + /* */ + /* Note that the `FOND' resource isn't checked. */ + /* */ +#define FT_CONFIG_OPTION_MAC_FONTS + + + /*************************************************************************/ + /* */ + /* Guessing methods to access embedded resource forks */ + /* */ + /* Enable extra Mac fonts support on non-Mac platforms (e.g. */ + /* GNU/Linux). */ + /* */ + /* Resource forks which include fonts data are stored sometimes in */ + /* locations which users or developers don't expected. In some cases, */ + /* resource forks start with some offset from the head of a file. In */ + /* other cases, the actual resource fork is stored in file different */ + /* from what the user specifies. If this option is activated, */ + /* FreeType tries to guess whether such offsets or different file */ + /* names must be used. */ + /* */ + /* Note that normal, direct access of resource forks is controlled via */ + /* the FT_CONFIG_OPTION_MAC_FONTS option. */ + /* */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + + + /*************************************************************************/ + /* */ + /* Allow the use of FT_Incremental_Interface to load typefaces that */ + /* contain no glyph data, but supply it via a callback function. */ + /* This allows FreeType to be used with the PostScript language, using */ + /* the GhostScript interpreter. */ + /* */ +/* #define FT_CONFIG_OPTION_INCREMENTAL */ + + + /*************************************************************************/ + /* */ + /* The size in bytes of the render pool used by the scan-line converter */ + /* to do all of its work. */ + /* */ + /* This must be greater than 4KByte if you use FreeType to rasterize */ + /* glyphs; otherwise, you may set it to zero to avoid unnecessary */ + /* allocation of the render pool. */ + /* */ +#define FT_RENDER_POOL_SIZE 16384L + + + /*************************************************************************/ + /* */ + /* FT_MAX_MODULES */ + /* */ + /* The maximum number of modules that can be registered in a single */ + /* FreeType library object. 32 is the default. */ + /* */ +#define FT_MAX_MODULES 32 + + + /*************************************************************************/ + /* */ + /* Debug level */ + /* */ + /* FreeType can be compiled in debug or trace mode. In debug mode, */ + /* errors are reported through the `ftdebug' component. In trace */ + /* mode, additional messages are sent to the standard output during */ + /* execution. */ + /* */ + /* Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. */ + /* Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. */ + /* */ + /* Don't define any of these macros to compile in `release' mode! */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +/* #define FT_DEBUG_LEVEL_ERROR */ +/* #define FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /* */ + /* Memory Debugging */ + /* */ + /* FreeType now comes with an integrated memory debugger that is */ + /* capable of detecting simple errors like memory leaks or double */ + /* deletes. To compile it within your build of the library, you */ + /* should define FT_DEBUG_MEMORY here. */ + /* */ + /* Note that the memory debugger is only activated at runtime when */ + /* when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ +/* #define FT_DEBUG_MEMORY */ + + + /*************************************************************************/ + /* */ + /* Module errors */ + /* */ + /* If this macro is set (which is _not_ the default), the higher byte */ + /* of an error code gives the module in which the error has occurred, */ + /* while the lower byte is the real error code. */ + /* */ + /* Setting this macro makes sense for debugging purposes only, since */ + /* it would break source compatibility of certain programs that use */ + /* FreeType 2. */ + /* */ + /* More details can be found in the files ftmoderr.h and fterrors.h. */ + /* */ +#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS + + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */ + /* embedded bitmaps in all formats using the SFNT module (namely */ + /* TrueType & OpenType). */ + /* */ +#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to */ + /* load and enumerate the glyph Postscript names in a TrueType or */ + /* OpenType file. */ + /* */ + /* Note that when you do not compile the `PSNames' module by undefining */ + /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will */ + /* contain additional code used to read the PS Names table from a font. */ + /* */ + /* (By default, the module uses `PSNames' to extract glyph names.) */ + /* */ +#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to */ + /* access the internal name table in a SFNT-based format like TrueType */ + /* or OpenType. The name table contains various strings used to */ + /* describe the font, like family name, copyright, version, etc. It */ + /* does not contain any glyph name though. */ + /* */ + /* Accessing SFNT names is done through the functions declared in */ + /* `freetype/ftnames.h'. */ + /* */ +#define TT_CONFIG_OPTION_SFNT_NAMES + + + /*************************************************************************/ + /* */ + /* TrueType CMap support */ + /* */ + /* Here you can fine-tune which TrueType CMap table format shall be */ + /* supported. */ +#define TT_CONFIG_CMAP_FORMAT_0 +#define TT_CONFIG_CMAP_FORMAT_2 +#define TT_CONFIG_CMAP_FORMAT_4 +#define TT_CONFIG_CMAP_FORMAT_6 +#define TT_CONFIG_CMAP_FORMAT_8 +#define TT_CONFIG_CMAP_FORMAT_10 +#define TT_CONFIG_CMAP_FORMAT_12 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */ + /* a bytecode interpreter in the TrueType driver. Note that there are */ + /* important patent issues related to the use of the interpreter. */ + /* */ + /* By undefining this, you will only compile the code necessary to load */ + /* TrueType glyphs without hinting. */ + /* */ + /* Do not #undef this macro here, since the build system might */ + /* define it for certain configurations only. */ + /* */ +/* #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */ + /* of the TrueType bytecode interpreter is used that doesn't implement */ + /* any of the patented opcodes and algorithms. Note that the */ + /* the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* if you */ + /* define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; with other words, */ + /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */ + /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time. */ + /* */ + /* This macro is only useful for a small number of font files (mostly */ + /* for Asian scripts) that require bytecode interpretation to properly */ + /* load glyphs. For all other fonts, this produces unpleasant results, */ + /* thus the unpatented interpreter is never used to load glyphs from */ + /* TrueType fonts unless one of the following two options is used. */ + /* */ + /* - The unpatented interpreter is explicitly activated by the user */ + /* through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag */ + /* when opening the FT_Face. */ + /* */ + /* - FreeType detects that the FT_Face corresponds to one of the */ + /* `trick' fonts (e.g., `Mingliu') it knows about. The font engine */ + /* contains a hard-coded list of font names and other matching */ + /* parameters (see function `tt_face_init' in file */ + /* `src/truetype/ttobjs.c'). */ + /* */ + /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */ + /* */ + /* { */ + /* FT_Parameter parameter; */ + /* FT_Open_Args open_args; */ + /* */ + /* */ + /* parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING; */ + /* */ + /* open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; */ + /* open_args.pathname = my_font_pathname; */ + /* open_args.num_params = 1; */ + /* open_args.params = ¶meter; */ + /* */ + /* error = FT_Open_Face( library, &open_args, index, &face ); */ + /* ... */ + /* } */ + /* */ +#define TT_CONFIG_OPTION_UNPATENTED_HINTING + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType */ + /* bytecode interpreter with a huge switch statement, rather than a call */ + /* table. This results in smaller and faster code for a number of */ + /* architectures. */ + /* */ + /* Note however that on some compiler/processor combinations, undefining */ + /* this macro will generate faster, though larger, code. */ + /* */ +#define TT_CONFIG_OPTION_INTERPRETER_SWITCH + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the */ + /* TrueType glyph loader to use Apple's definition of how to handle */ + /* component offsets in composite glyphs. */ + /* */ + /* Apple and MS disagree on the default behavior of component offsets */ + /* in composites. Apple says that they should be scaled by the scaling */ + /* factors in the transformation matrix (roughly, it's more complex) */ + /* while MS says they should not. OpenType defines two bits in the */ + /* composite flags array which can be used to disambiguate, but old */ + /* fonts will not have them. */ + /* */ + /* http://partners.adobe.com/asn/developer/opentype/glyf.html */ + /* http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html */ + /* */ +#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include */ + /* support for Apple's distortable font technology (fvar, gvar, cvar, */ + /* and avar tables). This has many similarities to Type 1 Multiple */ + /* Masters support. */ + /* */ +#define TT_CONFIG_OPTION_GX_VAR_SUPPORT + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BDF if you want to include support for */ + /* an embedded `BDF ' table within SFNT-based bitmap formats. */ + /* */ +#define TT_CONFIG_OPTION_BDF + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* T1_MAX_DICT_DEPTH is the maximal depth of nest dictionaries and */ + /* arrays in the Type 1 stream (see t1load.c). A minimum of 4 is */ + /* required. */ + /* */ +#define T1_MAX_DICT_DEPTH 5 + + + /*************************************************************************/ + /* */ + /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ + /* calls during glyph loading. */ + /* */ +#define T1_MAX_SUBRS_CALLS 16 + + + /*************************************************************************/ + /* */ + /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ + /* minimum of 16 is required. */ + /* */ + /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */ + /* */ +#define T1_MAX_CHARSTRINGS_OPERANDS 256 + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of `t1afm', which is in charge of reading Type 1 AFM */ + /* files into an existing face. Note that if set, the T1 driver will be */ + /* unable to produce kerning distances. */ + /* */ +#undef T1_CONFIG_OPTION_NO_AFM + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of the Multiple Masters font support in the Type 1 */ + /* driver. */ + /* */ +#undef T1_CONFIG_OPTION_NO_MM_SUPPORT + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Compile autofit module with CJK script support. */ + /* */ +#define AF_CONFIG_OPTION_CJK + + /*************************************************************************/ + /* */ + /* Compile autofit module with Indic script support. */ + /* */ +#define AF_CONFIG_OPTION_INDIC + + /* */ + + + /* + * Define this variable if you want to keep the layout of internal + * structures that was used prior to FreeType 2.2. This also compiles in + * a few obsolete functions to avoid linking problems on typical Unix + * distributions. + * + * For embedded systems or building a new distribution from scratch, it + * is recommended to disable the macro since it reduces the library's code + * size and activates a few memory-saving optimizations as well. + */ +#define FT_CONFIG_OPTION_OLD_INTERNALS + + + /* + * This variable is defined if either unpatented or native TrueType + * hinting is requested by the definitions above. + */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#define TT_USE_BYTECODE_INTERPRETER +#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING +#define TT_USE_BYTECODE_INTERPRETER +#endif + +FT_END_HEADER + + +#endif /* __FTOPTION_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/config/ftstdlib.h b/libIGraph/include/freetype/config/ftstdlib.h new file mode 100644 index 0000000..f923f3e --- /dev/null +++ b/libIGraph/include/freetype/config/ftstdlib.h @@ -0,0 +1,180 @@ +/***************************************************************************/ +/* */ +/* ftstdlib.h */ +/* */ +/* ANSI-specific library and header configuration file (specification */ +/* only). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to group all #includes to the ANSI C library that */ + /* FreeType normally requires. It also defines macros to rename the */ + /* standard functions within the FreeType source code. */ + /* */ + /* Load a file which defines __FTSTDLIB_H__ before this one to override */ + /* it. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTSTDLIB_H__ +#define __FTSTDLIB_H__ + + +#include <stddef.h> + +#define ft_ptrdiff_t ptrdiff_t + + + /**********************************************************************/ + /* */ + /* integer limits */ + /* */ + /* UINT_MAX and ULONG_MAX are used to automatically compute the size */ + /* of `int' and `long' in bytes at compile-time. So far, this works */ + /* for all platforms the library has been tested on. */ + /* */ + /* Note that on the extremely rare platforms that do not provide */ + /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some */ + /* old Crays where `int' is 36 bits), we do not make any guarantee */ + /* about the correct behaviour of FT2 with all fonts. */ + /* */ + /* In these case, `ftconfig.h' will refuse to compile anyway with a */ + /* message like `couldn't find 32-bit type' or something similar. */ + /* */ + /* IMPORTANT NOTE: We do not define aliases for heap management and */ + /* i/o routines (i.e. malloc/free/fopen/fread/...) */ + /* since these functions should all be encapsulated */ + /* by platform-specific implementations of */ + /* `ftsystem.c'. */ + /* */ + /**********************************************************************/ + + +#include <limits.h> + +#define FT_CHAR_BIT CHAR_BIT +#define FT_INT_MAX INT_MAX +#define FT_UINT_MAX UINT_MAX +#define FT_ULONG_MAX ULONG_MAX + + + /**********************************************************************/ + /* */ + /* character and string processing */ + /* */ + /**********************************************************************/ + + +#include <string.h> + +#define ft_memchr memchr +#define ft_memcmp memcmp +#define ft_memcpy memcpy +#define ft_memmove memmove +#define ft_memset memset +#define ft_strcat strcat +#define ft_strcmp strcmp +#define ft_strcpy strcpy +#define ft_strlen strlen +#define ft_strncmp strncmp +#define ft_strncpy strncpy +#define ft_strrchr strrchr +#define ft_strstr strstr + + + /**********************************************************************/ + /* */ + /* file handling */ + /* */ + /**********************************************************************/ + + +#include <stdio.h> + +#define FT_FILE FILE +#define ft_fclose fclose +#define ft_fopen fopen +#define ft_fread fread +#define ft_fseek fseek +#define ft_ftell ftell +#define ft_sprintf sprintf + + + /**********************************************************************/ + /* */ + /* sorting */ + /* */ + /**********************************************************************/ + + +#include <stdlib.h> + +#define ft_qsort qsort + +#define ft_exit exit /* only used to exit from unhandled exceptions */ + + + /**********************************************************************/ + /* */ + /* memory allocation */ + /* */ + /**********************************************************************/ + + +#define ft_scalloc calloc +#define ft_sfree free +#define ft_smalloc malloc +#define ft_srealloc realloc + + + /**********************************************************************/ + /* */ + /* miscellaneous */ + /* */ + /**********************************************************************/ + + +#define ft_atol atol +#define ft_labs labs + + + /**********************************************************************/ + /* */ + /* execution control */ + /* */ + /**********************************************************************/ + + +#include <setjmp.h> + +#define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */ + /* jmp_buf is defined as a macro */ + /* on certain platforms */ + +#define ft_longjmp longjmp +#define ft_setjmp( b ) setjmp( *(jmp_buf*) &(b) ) /* same thing here */ + + + /* the following is only used for debugging purposes, i.e., if */ + /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined */ + +#include <stdarg.h> + + +#endif /* __FTSTDLIB_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/freetype.h b/libIGraph/include/freetype/freetype.h new file mode 100644 index 0000000..dbca087 --- /dev/null +++ b/libIGraph/include/freetype/freetype.h @@ -0,0 +1,3434 @@ +/***************************************************************************/ +/* */ +/* freetype.h */ +/* */ +/* FreeType high-level API and common types (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef FT_FREETYPE_H +#error "`ft2build.h' hasn't been included yet!" +#error "Please always use macros to include FreeType header files." +#error "Example:" +#error " #include <ft2build.h>" +#error " #include FT_FREETYPE_H" +#endif + + + /*************************************************************************/ + /* */ + /* The `raster' component duplicates some of the declarations in */ + /* freetype.h for stand-alone use if _FREETYPE_ isn't defined. */ + /* */ + /*************************************************************************/ + + +#ifndef __FREETYPE_H__ +#define __FREETYPE_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_ERRORS_H +#include FT_TYPES_H + + +FT_BEGIN_HEADER + + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* user_allocation */ + /* */ + /* <Title> */ + /* User allocation */ + /* */ + /* <Abstract> */ + /* How client applications should allocate FreeType data structures. */ + /* */ + /* <Description> */ + /* FreeType assumes that structures allocated by the user and passed */ + /* as arguments are zeroed out except for the actual data. With */ + /* other words, it is recommended to use `calloc' (or variants of it) */ + /* instead of `malloc' for allocation. */ + /* */ + /*************************************************************************/ + + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S I C T Y P E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* base_interface */ + /* */ + /* <Title> */ + /* Base Interface */ + /* */ + /* <Abstract> */ + /* The FreeType 2 base font interface. */ + /* */ + /* <Description> */ + /* This section describes the public high-level API of FreeType 2. */ + /* */ + /* <Order> */ + /* FT_Library */ + /* FT_Face */ + /* FT_Size */ + /* FT_GlyphSlot */ + /* FT_CharMap */ + /* FT_Encoding */ + /* */ + /* FT_FaceRec */ + /* */ + /* FT_FACE_FLAG_SCALABLE */ + /* FT_FACE_FLAG_FIXED_SIZES */ + /* FT_FACE_FLAG_FIXED_WIDTH */ + /* FT_FACE_FLAG_HORIZONTAL */ + /* FT_FACE_FLAG_VERTICAL */ + /* FT_FACE_FLAG_SFNT */ + /* FT_FACE_FLAG_KERNING */ + /* FT_FACE_FLAG_MULTIPLE_MASTERS */ + /* FT_FACE_FLAG_GLYPH_NAMES */ + /* FT_FACE_FLAG_EXTERNAL_STREAM */ + /* FT_FACE_FLAG_FAST_GLYPHS */ + /* FT_FACE_FLAG_HINTER */ + /* */ + /* FT_STYLE_FLAG_BOLD */ + /* FT_STYLE_FLAG_ITALIC */ + /* */ + /* FT_SizeRec */ + /* FT_Size_Metrics */ + /* */ + /* FT_GlyphSlotRec */ + /* FT_Glyph_Metrics */ + /* FT_SubGlyph */ + /* */ + /* FT_Bitmap_Size */ + /* */ + /* FT_Init_FreeType */ + /* FT_Done_FreeType */ + /* */ + /* FT_New_Face */ + /* FT_Done_Face */ + /* FT_New_Memory_Face */ + /* FT_Open_Face */ + /* FT_Open_Args */ + /* FT_Parameter */ + /* FT_Attach_File */ + /* FT_Attach_Stream */ + /* */ + /* FT_Set_Char_Size */ + /* FT_Set_Pixel_Sizes */ + /* FT_Request_Size */ + /* FT_Select_Size */ + /* FT_Size_Request_Type */ + /* FT_Size_Request */ + /* FT_Set_Transform */ + /* FT_Load_Glyph */ + /* FT_Get_Char_Index */ + /* FT_Get_Name_Index */ + /* FT_Load_Char */ + /* */ + /* FT_OPEN_MEMORY */ + /* FT_OPEN_STREAM */ + /* FT_OPEN_PATHNAME */ + /* FT_OPEN_DRIVER */ + /* FT_OPEN_PARAMS */ + /* */ + /* FT_LOAD_DEFAULT */ + /* FT_LOAD_RENDER */ + /* FT_LOAD_MONOCHROME */ + /* FT_LOAD_LINEAR_DESIGN */ + /* FT_LOAD_NO_SCALE */ + /* FT_LOAD_NO_HINTING */ + /* FT_LOAD_NO_BITMAP */ + /* FT_LOAD_CROP_BITMAP */ + /* */ + /* FT_LOAD_VERTICAL_LAYOUT */ + /* FT_LOAD_IGNORE_TRANSFORM */ + /* FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH */ + /* FT_LOAD_FORCE_AUTOHINT */ + /* FT_LOAD_NO_RECURSE */ + /* FT_LOAD_PEDANTIC */ + /* */ + /* FT_LOAD_TARGET_NORMAL */ + /* FT_LOAD_TARGET_LIGHT */ + /* FT_LOAD_TARGET_MONO */ + /* FT_LOAD_TARGET_LCD */ + /* FT_LOAD_TARGET_LCD_V */ + /* */ + /* FT_Render_Glyph */ + /* FT_Render_Mode */ + /* FT_Get_Kerning */ + /* FT_Kerning_Mode */ + /* FT_Get_Track_Kerning */ + /* FT_Get_Glyph_Name */ + /* FT_Get_Postscript_Name */ + /* */ + /* FT_CharMapRec */ + /* FT_Select_Charmap */ + /* FT_Set_Charmap */ + /* FT_Get_Charmap_Index */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Glyph_Metrics */ + /* */ + /* <Description> */ + /* A structure used to model the metrics of a single glyph. The */ + /* values are expressed in 26.6 fractional pixel format; if the flag */ + /* @FT_LOAD_NO_SCALE has been used while loading the glyph, values */ + /* are expressed in font units instead. */ + /* */ + /* <Fields> */ + /* width :: */ + /* The glyph's width. */ + /* */ + /* height :: */ + /* The glyph's height. */ + /* */ + /* horiBearingX :: */ + /* Left side bearing for horizontal layout. */ + /* */ + /* horiBearingY :: */ + /* Top side bearing for horizontal layout. */ + /* */ + /* horiAdvance :: */ + /* Advance width for horizontal layout. */ + /* */ + /* vertBearingX :: */ + /* Left side bearing for vertical layout. */ + /* */ + /* vertBearingY :: */ + /* Top side bearing for vertical layout. */ + /* */ + /* vertAdvance :: */ + /* Advance height for vertical layout. */ + /* */ + typedef struct FT_Glyph_Metrics_ + { + FT_Pos width; + FT_Pos height; + + FT_Pos horiBearingX; + FT_Pos horiBearingY; + FT_Pos horiAdvance; + + FT_Pos vertBearingX; + FT_Pos vertBearingY; + FT_Pos vertAdvance; + + } FT_Glyph_Metrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Bitmap_Size */ + /* */ + /* <Description> */ + /* This structure models the metrics of a bitmap strike (i.e., a set */ + /* of glyphs for a given point size and resolution) in a bitmap font. */ + /* It is used for the `available_sizes' field of @FT_Face. */ + /* */ + /* <Fields> */ + /* height :: The vertical distance, in pixels, between two */ + /* consecutive baselines. It is always positive. */ + /* */ + /* width :: The average width, in pixels, of all glyphs in the */ + /* strike. */ + /* */ + /* size :: The nominal size of the strike in 26.6 fractional */ + /* points. This field is not very useful. */ + /* */ + /* x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional */ + /* pixels. */ + /* */ + /* y_ppem :: The vertical ppem (nominal height) in 26.6 fractional */ + /* pixels. */ + /* */ + /* <Note> */ + /* Windows FNT: */ + /* The nominal size given in a FNT font is not reliable. Thus when */ + /* the driver finds it incorrect, it sets `size' to some calculated */ + /* values and sets `x_ppem' and `y_ppem' to the pixel width and */ + /* height given in the font, respectively. */ + /* */ + /* TrueType embedded bitmaps: */ + /* `size', `width', and `height' values are not contained in the */ + /* bitmap strike itself. They are computed from the global font */ + /* parameters. */ + /* */ + typedef struct FT_Bitmap_Size_ + { + FT_Short height; + FT_Short width; + + FT_Pos size; + + FT_Pos x_ppem; + FT_Pos y_ppem; + + } FT_Bitmap_Size; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Library */ + /* */ + /* <Description> */ + /* A handle to a FreeType library instance. Each `library' is */ + /* completely independent from the others; it is the `root' of a set */ + /* of objects like fonts, faces, sizes, etc. */ + /* */ + /* It also embeds a memory manager (see @FT_Memory), as well as a */ + /* scan-line converter object (see @FT_Raster). */ + /* */ + /* For multi-threading applications each thread should have its own */ + /* FT_Library object. */ + /* */ + /* <Note> */ + /* Library objects are normally created by @FT_Init_FreeType, and */ + /* destroyed with @FT_Done_FreeType. */ + /* */ + typedef struct FT_LibraryRec_ *FT_Library; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Module */ + /* */ + /* <Description> */ + /* A handle to a given FreeType module object. Each module can be a */ + /* font driver, a renderer, or anything else that provides services */ + /* to the formers. */ + /* */ + typedef struct FT_ModuleRec_* FT_Module; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Driver */ + /* */ + /* <Description> */ + /* A handle to a given FreeType font driver object. Each font driver */ + /* is a special module capable of creating faces from font files. */ + /* */ + typedef struct FT_DriverRec_* FT_Driver; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Renderer */ + /* */ + /* <Description> */ + /* A handle to a given FreeType renderer. A renderer is a special */ + /* module in charge of converting a glyph image to a bitmap, when */ + /* necessary. Each renderer supports a given glyph image format, and */ + /* one or more target surface depths. */ + /* */ + typedef struct FT_RendererRec_* FT_Renderer; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Face */ + /* */ + /* <Description> */ + /* A handle to a given typographic face object. A face object models */ + /* a given typeface, in a given style. */ + /* */ + /* <Note> */ + /* Each face object also owns a single @FT_GlyphSlot object, as well */ + /* as one or more @FT_Size objects. */ + /* */ + /* Use @FT_New_Face or @FT_Open_Face to create a new face object from */ + /* a given filepathname or a custom input stream. */ + /* */ + /* Use @FT_Done_Face to destroy it (along with its slot and sizes). */ + /* */ + /* <Also> */ + /* The @FT_FaceRec details the publicly accessible fields of a given */ + /* face object. */ + /* */ + typedef struct FT_FaceRec_* FT_Face; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Size */ + /* */ + /* <Description> */ + /* A handle to an object used to model a face scaled to a given */ + /* character size. */ + /* */ + /* <Note> */ + /* Each @FT_Face has an _active_ @FT_Size object that is used by */ + /* functions like @FT_Load_Glyph to determine the scaling */ + /* transformation which is used to load and hint glyphs and metrics. */ + /* */ + /* You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes, */ + /* @FT_Request_Size or even @FT_Select_Size to change the content */ + /* (i.e., the scaling values) of the active @FT_Size. */ + /* */ + /* You can use @FT_New_Size to create additional size objects for a */ + /* given @FT_Face, but they won't be used by other functions until */ + /* you activate it through @FT_Activate_Size. Only one size can be */ + /* activated at any given time per face. */ + /* */ + /* <Also> */ + /* The @FT_SizeRec structure details the publicly accessible fields */ + /* of a given size object. */ + /* */ + typedef struct FT_SizeRec_* FT_Size; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_GlyphSlot */ + /* */ + /* <Description> */ + /* A handle to a given `glyph slot'. A slot is a container where it */ + /* is possible to load any one of the glyphs contained in its parent */ + /* face. */ + /* */ + /* In other words, each time you call @FT_Load_Glyph or */ + /* @FT_Load_Char, the slot's content is erased by the new glyph data, */ + /* i.e., the glyph's metrics, its image (bitmap or outline), and */ + /* other control information. */ + /* */ + /* <Also> */ + /* @FT_GlyphSlotRec details the publicly accessible glyph fields. */ + /* */ + typedef struct FT_GlyphSlotRec_* FT_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_CharMap */ + /* */ + /* <Description> */ + /* A handle to a given character map. A charmap is used to translate */ + /* character codes in a given encoding into glyph indexes for its */ + /* parent's face. Some font formats may provide several charmaps per */ + /* font. */ + /* */ + /* Each face object owns zero or more charmaps, but only one of them */ + /* can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char. */ + /* */ + /* The list of available charmaps in a face is available through the */ + /* `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec. */ + /* */ + /* The currently active charmap is available as `face->charmap'. */ + /* You should call @FT_Set_Charmap to change it. */ + /* */ + /* <Note> */ + /* When a new face is created (either through @FT_New_Face or */ + /* @FT_Open_Face), the library looks for a Unicode charmap within */ + /* the list and automatically activates it. */ + /* */ + /* <Also> */ + /* The @FT_CharMapRec details the publicly accessible fields of a */ + /* given character map. */ + /* */ + typedef struct FT_CharMapRec_* FT_CharMap; + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_ENC_TAG */ + /* */ + /* <Description> */ + /* This macro converts four-letter tags into an unsigned long. It is */ + /* used to define `encoding' identifiers (see @FT_Encoding). */ + /* */ + /* <Note> */ + /* Since many 16bit compilers don't like 32bit enumerations, you */ + /* should redefine this macro in case of problems to something like */ + /* this: */ + /* */ + /* { */ + /* #define FT_ENC_TAG( value, a, b, c, d ) value */ + /* } */ + /* */ + /* to get a simple enumeration without assigning special numbers. */ + /* */ + +#ifndef FT_ENC_TAG +#define FT_ENC_TAG( value, a, b, c, d ) \ + value = ( ( (FT_UInt32)(a) << 24 ) | \ + ( (FT_UInt32)(b) << 16 ) | \ + ( (FT_UInt32)(c) << 8 ) | \ + (FT_UInt32)(d) ) + +#endif /* FT_ENC_TAG */ + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Encoding */ + /* */ + /* <Description> */ + /* An enumeration used to specify character sets supported by */ + /* charmaps. Used in the @FT_Select_Charmap API function. */ + /* */ + /* <Note> */ + /* Despite the name, this enumeration lists specific character */ + /* repertories (i.e., charsets), and not text encoding methods (e.g., */ + /* UTF-8, UTF-16, GB2312_EUC, etc.). */ + /* */ + /* Because of 32-bit charcodes defined in Unicode (i.e., surrogates), */ + /* all character codes must be expressed as FT_Longs. */ + /* */ + /* Other encodings might be defined in the future. */ + /* */ + /* <Values> */ + /* FT_ENCODING_NONE :: */ + /* The encoding value 0 is reserved. */ + /* */ + /* FT_ENCODING_UNICODE :: */ + /* Corresponds to the Unicode character set. This value covers */ + /* all versions of the Unicode repertoire, including ASCII and */ + /* Latin-1. Most fonts include a Unicode charmap, but not all */ + /* of them. */ + /* */ + /* FT_ENCODING_MS_SYMBOL :: */ + /* Corresponds to the Microsoft Symbol encoding, used to encode */ + /* mathematical symbols in the 32..255 character code range. For */ + /* more information, see `http://www.ceviz.net/symbol.htm'. */ + /* */ + /* FT_ENCODING_SJIS :: */ + /* Corresponds to Japanese SJIS encoding. More info at */ + /* at `http://langsupport.japanreference.com/encoding.shtml'. */ + /* See note on multi-byte encodings below. */ + /* */ + /* FT_ENCODING_GB2312 :: */ + /* Corresponds to an encoding system for Simplified Chinese as used */ + /* used in mainland China. */ + /* */ + /* FT_ENCODING_BIG5 :: */ + /* Corresponds to an encoding system for Traditional Chinese as used */ + /* in Taiwan and Hong Kong. */ + /* */ + /* FT_ENCODING_WANSUNG :: */ + /* Corresponds to the Korean encoding system known as Wansung. */ + /* For more information see */ + /* `http://www.microsoft.com/typography/unicode/949.txt'. */ + /* */ + /* FT_ENCODING_JOHAB :: */ + /* The Korean standard character set (KS C-5601-1992), which */ + /* corresponds to MS Windows code page 1361. This character set */ + /* includes all possible Hangeul character combinations. */ + /* */ + /* FT_ENCODING_ADOBE_LATIN_1 :: */ + /* Corresponds to a Latin-1 encoding as defined in a Type 1 */ + /* Postscript font. It is limited to 256 character codes. */ + /* */ + /* FT_ENCODING_ADOBE_STANDARD :: */ + /* Corresponds to the Adobe Standard encoding, as found in Type 1, */ + /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ + /* codes. */ + /* */ + /* FT_ENCODING_ADOBE_EXPERT :: */ + /* Corresponds to the Adobe Expert encoding, as found in Type 1, */ + /* CFF, and OpenType/CFF fonts. It is limited to 256 character */ + /* codes. */ + /* */ + /* FT_ENCODING_ADOBE_CUSTOM :: */ + /* Corresponds to a custom encoding, as found in Type 1, CFF, and */ + /* OpenType/CFF fonts. It is limited to 256 character codes. */ + /* */ + /* FT_ENCODING_APPLE_ROMAN :: */ + /* Corresponds to the 8-bit Apple roman encoding. Many TrueType and */ + /* OpenType fonts contain a charmap for this encoding, since older */ + /* versions of Mac OS are able to use it. */ + /* */ + /* FT_ENCODING_OLD_LATIN_2 :: */ + /* This value is deprecated and was never used nor reported by */ + /* FreeType. Don't use or test for it. */ + /* */ + /* FT_ENCODING_MS_SJIS :: */ + /* Same as FT_ENCODING_SJIS. Deprecated. */ + /* */ + /* FT_ENCODING_MS_GB2312 :: */ + /* Same as FT_ENCODING_GB2312. Deprecated. */ + /* */ + /* FT_ENCODING_MS_BIG5 :: */ + /* Same as FT_ENCODING_BIG5. Deprecated. */ + /* */ + /* FT_ENCODING_MS_WANSUNG :: */ + /* Same as FT_ENCODING_WANSUNG. Deprecated. */ + /* */ + /* FT_ENCODING_MS_JOHAB :: */ + /* Same as FT_ENCODING_JOHAB. Deprecated. */ + /* */ + /* <Note> */ + /* By default, FreeType automatically synthetizes a Unicode charmap */ + /* for Postscript fonts, using their glyph names dictionaries. */ + /* However, it also reports the encodings defined explicitly in the */ + /* font file, for the cases when they are needed, with the Adobe */ + /* values as well. */ + /* */ + /* FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap */ + /* is neither Unicode nor ISO-8859-1 (otherwise it is set to */ + /* FT_ENCODING_UNICODE). Use @FT_Get_BDF_Charset_ID to find out which */ + /* encoding is really present. If, for example, the `cs_registry' */ + /* field is `KOI8' and the `cs_encoding' field is `R', the font is */ + /* encoded in KOI8-R. */ + /* */ + /* FT_ENCODING_NONE is always set (with a single exception) by the */ + /* winfonts driver. Use @FT_Get_WinFNT_Header and examine the */ + /* `charset' field of the @FT_WinFNT_HeaderRec structure to find out */ + /* which encoding is really present. For example, */ + /* @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for */ + /* Russian). */ + /* */ + /* FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */ + /* and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to */ + /* FT_ENCODING_APPLE_ROMAN). */ + /* */ + /* If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function c */ + /* @FT_Get_CMap_Language_ID to query the Mac language ID which may be */ + /* needed to be able to distinguish Apple encoding variants. See */ + /* */ + /* http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT */ + /* */ + /* to get an idea how to do that. Basically, if the language ID is 0, */ + /* don't use it, otherwise subtract 1 from the language ID. Then */ + /* examine `encoding_id'. If, for example, `encoding_id' is */ + /* @TT_MAC_ID_ROMAN and the language ID (minus 1) is */ + /* `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman. */ + /* @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi */ + /* variant the Arabic encoding. */ + /* */ + typedef enum FT_Encoding_ + { + FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ), + + FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ), + FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ), + + FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ), + FT_ENC_TAG( FT_ENCODING_GB2312, 'g', 'b', ' ', ' ' ), + FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ), + FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ), + FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ), + + /* for backwards compatibility */ + FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS, + FT_ENCODING_MS_GB2312 = FT_ENCODING_GB2312, + FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5, + FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG, + FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB, + + FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ), + FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ), + + FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ), + + FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' ) + + } FT_Encoding; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_encoding_xxx */ + /* */ + /* <Description> */ + /* These constants are deprecated; use the corresponding @FT_Encoding */ + /* values instead. */ + /* */ +#define ft_encoding_none FT_ENCODING_NONE +#define ft_encoding_unicode FT_ENCODING_UNICODE +#define ft_encoding_symbol FT_ENCODING_MS_SYMBOL +#define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1 +#define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2 +#define ft_encoding_sjis FT_ENCODING_SJIS +#define ft_encoding_gb2312 FT_ENCODING_GB2312 +#define ft_encoding_big5 FT_ENCODING_BIG5 +#define ft_encoding_wansung FT_ENCODING_WANSUNG +#define ft_encoding_johab FT_ENCODING_JOHAB + +#define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD +#define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT +#define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM +#define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_CharMapRec */ + /* */ + /* <Description> */ + /* The base charmap structure. */ + /* */ + /* <Fields> */ + /* face :: A handle to the parent face object. */ + /* */ + /* encoding :: An @FT_Encoding tag identifying the charmap. Use */ + /* this with @FT_Select_Charmap. */ + /* */ + /* platform_id :: An ID number describing the platform for the */ + /* following encoding ID. This comes directly from */ + /* the TrueType specification and should be emulated */ + /* for other formats. */ + /* */ + /* encoding_id :: A platform specific encoding number. This also */ + /* comes from the TrueType specification and should be */ + /* emulated similarly. */ + /* */ + typedef struct FT_CharMapRec_ + { + FT_Face face; + FT_Encoding encoding; + FT_UShort platform_id; + FT_UShort encoding_id; + + } FT_CharMapRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* B A S E O B J E C T C L A S S E S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Face_Internal */ + /* */ + /* <Description> */ + /* An opaque handle to an `FT_Face_InternalRec' structure, used to */ + /* model private data of a given @FT_Face object. */ + /* */ + /* This structure might change between releases of FreeType 2 and is */ + /* not generally available to client applications. */ + /* */ + typedef struct FT_Face_InternalRec_* FT_Face_Internal; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_FaceRec */ + /* */ + /* <Description> */ + /* FreeType root face class structure. A face object models a */ + /* typeface in a font file. */ + /* */ + /* <Fields> */ + /* num_faces :: The number of faces in the font file. Some */ + /* font formats can have multiple faces in */ + /* a font file. */ + /* */ + /* face_index :: The index of the face in the font file. It */ + /* is set to 0 if there is only one face in */ + /* the font file. */ + /* */ + /* face_flags :: A set of bit flags that give important */ + /* information about the face; see */ + /* @FT_FACE_FLAG_XXX for the details. */ + /* */ + /* style_flags :: A set of bit flags indicating the style of */ + /* the face; see @FT_STYLE_FLAG_XXX for the */ + /* details. */ + /* */ + /* num_glyphs :: The number of glyphs in the face. If the */ + /* face is scalable and has sbits (see */ + /* `num_fixed_sizes'), it is set to the number */ + /* of outline glyphs. */ + /* */ + /* family_name :: The face's family name. This is an ASCII */ + /* string, usually in English, which describes */ + /* the typeface's family (like `Times New */ + /* Roman', `Bodoni', `Garamond', etc). This */ + /* is a least common denominator used to list */ + /* fonts. Some formats (TrueType & OpenType) */ + /* provide localized and Unicode versions of */ + /* this string. Applications should use the */ + /* format specific interface to access them. */ + /* */ + /* style_name :: The face's style name. This is an ASCII */ + /* string, usually in English, which describes */ + /* the typeface's style (like `Italic', */ + /* `Bold', `Condensed', etc). Not all font */ + /* formats provide a style name, so this field */ + /* is optional, and can be set to NULL. As */ + /* for `family_name', some formats provide */ + /* localized and Unicode versions of this */ + /* string. Applications should use the format */ + /* specific interface to access them. */ + /* */ + /* num_fixed_sizes :: The number of bitmap strikes in the face. */ + /* Even if the face is scalable, there might */ + /* still be bitmap strikes, which are called */ + /* `sbits' in that case. */ + /* */ + /* available_sizes :: An array of @FT_Bitmap_Size for all bitmap */ + /* strikes in the face. It is set to NULL if */ + /* there is no bitmap strike. */ + /* */ + /* num_charmaps :: The number of charmaps in the face. */ + /* */ + /* charmaps :: An array of the charmaps of the face. */ + /* */ + /* generic :: A field reserved for client uses. See the */ + /* @FT_Generic type description. */ + /* */ + /* bbox :: The font bounding box. Coordinates are */ + /* expressed in font units (see */ + /* `units_per_EM'). The box is large enough */ + /* to contain any glyph from the font. Thus, */ + /* `bbox.yMax' can be seen as the `maximal */ + /* ascender', and `bbox.yMin' as the `minimal */ + /* descender'. Only relevant for scalable */ + /* formats. */ + /* */ + /* units_per_EM :: The number of font units per EM square for */ + /* this face. This is typically 2048 for */ + /* TrueType fonts, and 1000 for Type 1 fonts. */ + /* Only relevant for scalable formats. */ + /* */ + /* ascender :: The typographic ascender of the face, */ + /* expressed in font units. For font formats */ + /* not having this information, it is set to */ + /* `bbox.yMax'. Only relevant for scalable */ + /* formats. */ + /* */ + /* descender :: The typographic descender of the face, */ + /* expressed in font units. For font formats */ + /* not having this information, it is set to */ + /* `bbox.yMin'. Note that this field is */ + /* usually negative. Only relevant for */ + /* scalable formats. */ + /* */ + /* height :: The height is the vertical distance */ + /* between two consecutive baselines, */ + /* expressed in font units. It is always */ + /* positive. Only relevant for scalable */ + /* formats. */ + /* */ + /* max_advance_width :: The maximal advance width, in font units, */ + /* for all glyphs in this face. This can be */ + /* used to make word wrapping computations */ + /* faster. Only relevant for scalable */ + /* formats. */ + /* */ + /* max_advance_height :: The maximal advance height, in font units, */ + /* for all glyphs in this face. This is only */ + /* relevant for vertical layouts, and is set */ + /* to `height' for fonts that do not provide */ + /* vertical metrics. Only relevant for */ + /* scalable formats. */ + /* */ + /* underline_position :: The position, in font units, of the */ + /* underline line for this face. It's the */ + /* center of the underlining stem. Only */ + /* relevant for scalable formats. */ + /* */ + /* underline_thickness :: The thickness, in font units, of the */ + /* underline for this face. Only relevant for */ + /* scalable formats. */ + /* */ + /* glyph :: The face's associated glyph slot(s). */ + /* */ + /* size :: The current active size for this face. */ + /* */ + /* charmap :: The current active charmap for this face. */ + /* */ + /* <Note> */ + /* Fields may be changed after a call to @FT_Attach_File or */ + /* @FT_Attach_Stream. */ + /* */ + typedef struct FT_FaceRec_ + { + FT_Long num_faces; + FT_Long face_index; + + FT_Long face_flags; + FT_Long style_flags; + + FT_Long num_glyphs; + + FT_String* family_name; + FT_String* style_name; + + FT_Int num_fixed_sizes; + FT_Bitmap_Size* available_sizes; + + FT_Int num_charmaps; + FT_CharMap* charmaps; + + FT_Generic generic; + + /*# The following member variables (down to `underline_thickness') */ + /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */ + /*# for bitmap fonts. */ + FT_BBox bbox; + + FT_UShort units_per_EM; + FT_Short ascender; + FT_Short descender; + FT_Short height; + + FT_Short max_advance_width; + FT_Short max_advance_height; + + FT_Short underline_position; + FT_Short underline_thickness; + + FT_GlyphSlot glyph; + FT_Size size; + FT_CharMap charmap; + + /*@private begin */ + + FT_Driver driver; + FT_Memory memory; + FT_Stream stream; + + FT_ListRec sizes_list; + + FT_Generic autohint; + void* extensions; + + FT_Face_Internal internal; + + /*@private end */ + + } FT_FaceRec; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_FACE_FLAG_XXX */ + /* */ + /* <Description> */ + /* A list of bit flags used in the `face_flags' field of the */ + /* @FT_FaceRec structure. They inform client applications of */ + /* properties of the corresponding face. */ + /* */ + /* <Values> */ + /* FT_FACE_FLAG_SCALABLE :: */ + /* Indicates that the face contains outline glyphs. This doesn't */ + /* prevent bitmap strikes, i.e., a face can have both this and */ + /* and @FT_FACE_FLAG_FIXED_SIZES set. */ + /* */ + /* FT_FACE_FLAG_FIXED_SIZES :: */ + /* Indicates that the face contains bitmap strikes. See also the */ + /* `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec. */ + /* */ + /* FT_FACE_FLAG_FIXED_WIDTH :: */ + /* Indicates that the face contains fixed-width characters (like */ + /* Courier, Lucido, MonoType, etc.). */ + /* */ + /* FT_FACE_FLAG_SFNT :: */ + /* Indicates that the face uses the `sfnt' storage scheme. For */ + /* now, this means TrueType and OpenType. */ + /* */ + /* FT_FACE_FLAG_HORIZONTAL :: */ + /* Indicates that the face contains horizontal glyph metrics. This */ + /* should be set for all common formats. */ + /* */ + /* FT_FACE_FLAG_VERTICAL :: */ + /* Indicates that the face contains vertical glyph metrics. This */ + /* is only available in some formats, not all of them. */ + /* */ + /* FT_FACE_FLAG_KERNING :: */ + /* Indicates that the face contains kerning information. If set, */ + /* the kerning distance can be retrieved through the function */ + /* @FT_Get_Kerning. Otherwise the function always return the */ + /* vector (0,0). Note that FreeType doesn't handle kerning data */ + /* from the `GPOS' table (as present in some OpenType fonts). */ + /* */ + /* FT_FACE_FLAG_FAST_GLYPHS :: */ + /* THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. */ + /* */ + /* FT_FACE_FLAG_MULTIPLE_MASTERS :: */ + /* Indicates that the font contains multiple masters and is capable */ + /* of interpolating between them. See the multiple-masters */ + /* specific API for details. */ + /* */ + /* FT_FACE_FLAG_GLYPH_NAMES :: */ + /* Indicates that the font contains glyph names that can be */ + /* retrieved through @FT_Get_Glyph_Name. Note that some TrueType */ + /* fonts contain broken glyph name tables. Use the function */ + /* @FT_Has_PS_Glyph_Names when needed. */ + /* */ + /* FT_FACE_FLAG_EXTERNAL_STREAM :: */ + /* Used internally by FreeType to indicate that a face's stream was */ + /* provided by the client application and should not be destroyed */ + /* when @FT_Done_Face is called. Don't read or test this flag. */ + /* */ + /* FT_FACE_FLAG_HINTER :: */ + /* Set if the font driver has a hinting machine of its own. For */ + /* example, with TrueType fonts, it makes sense to use data from */ + /* the SFNT `gasp' table only if the native TrueType hinting engine */ + /* (with the bytecode interpreter) is available and active. */ + /* */ +#define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) +#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) +#define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 ) +#define FT_FACE_FLAG_SFNT ( 1L << 3 ) +#define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 ) +#define FT_FACE_FLAG_VERTICAL ( 1L << 5 ) +#define FT_FACE_FLAG_KERNING ( 1L << 6 ) +#define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 ) +#define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 ) +#define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 ) +#define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 ) +#define FT_FACE_FLAG_HINTER ( 1L << 11 ) + + /* */ + + + /************************************************************************* + * + * @macro: + * FT_HAS_HORIZONTAL( face ) + * + * @description: + * A macro that returns true whenever a face object contains + * horizontal metrics (this is true for all font formats though). + * + * @also: + * @FT_HAS_VERTICAL can be used to check for vertical metrics. + * + */ +#define FT_HAS_HORIZONTAL( face ) \ + ( face->face_flags & FT_FACE_FLAG_HORIZONTAL ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_VERTICAL( face ) + * + * @description: + * A macro that returns true whenever a face object contains vertical + * metrics. + * + */ +#define FT_HAS_VERTICAL( face ) \ + ( face->face_flags & FT_FACE_FLAG_VERTICAL ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_KERNING( face ) + * + * @description: + * A macro that returns true whenever a face object contains kerning + * data that can be accessed with @FT_Get_Kerning. + * + */ +#define FT_HAS_KERNING( face ) \ + ( face->face_flags & FT_FACE_FLAG_KERNING ) + + + /************************************************************************* + * + * @macro: + * FT_IS_SCALABLE( face ) + * + * @description: + * A macro that returns true whenever a face object contains a scalable + * font face (true for TrueType, Type 1, Type 42, CID, OpenType/CFF, + * and PFR font formats. + * + */ +#define FT_IS_SCALABLE( face ) \ + ( face->face_flags & FT_FACE_FLAG_SCALABLE ) + + + /************************************************************************* + * + * @macro: + * FT_IS_SFNT( face ) + * + * @description: + * A macro that returns true whenever a face object contains a font + * whose format is based on the SFNT storage scheme. This usually + * means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded + * bitmap fonts. + * + * If this macro is true, all functions defined in @FT_SFNT_NAMES_H and + * @FT_TRUETYPE_TABLES_H are available. + * + */ +#define FT_IS_SFNT( face ) \ + ( face->face_flags & FT_FACE_FLAG_SFNT ) + + + /************************************************************************* + * + * @macro: + * FT_IS_FIXED_WIDTH( face ) + * + * @description: + * A macro that returns true whenever a face object contains a font face + * that contains fixed-width (or `monospace', `fixed-pitch', etc.) + * glyphs. + * + */ +#define FT_IS_FIXED_WIDTH( face ) \ + ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_FIXED_SIZES( face ) + * + * @description: + * A macro that returns true whenever a face object contains some + * embedded bitmaps. See the `available_sizes' field of the + * @FT_FaceRec structure. + * + */ +#define FT_HAS_FIXED_SIZES( face ) \ + ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES ) + + /* */ + + + /************************************************************************* + * + * @macro: + * FT_HAS_FAST_GLYPHS( face ) + * + * @description: + * Deprecated. + * + */ +#define FT_HAS_FAST_GLYPHS( face ) 0 + + + /************************************************************************* + * + * @macro: + * FT_HAS_GLYPH_NAMES( face ) + * + * @description: + * A macro that returns true whenever a face object contains some glyph + * names that can be accessed through @FT_Get_Glyph_Name. + * + */ +#define FT_HAS_GLYPH_NAMES( face ) \ + ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) + + + /************************************************************************* + * + * @macro: + * FT_HAS_MULTIPLE_MASTERS( face ) + * + * @description: + * A macro that returns true whenever a face object contains some + * multiple masters. The functions provided by @FT_MULTIPLE_MASTERS_H + * are then available to choose the exact design you want. + * + */ +#define FT_HAS_MULTIPLE_MASTERS( face ) \ + ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS ) + + + /*************************************************************************/ + /* */ + /* <Constant> */ + /* FT_STYLE_FLAG_XXX */ + /* */ + /* <Description> */ + /* A list of bit-flags used to indicate the style of a given face. */ + /* These are used in the `style_flags' field of @FT_FaceRec. */ + /* */ + /* <Values> */ + /* FT_STYLE_FLAG_ITALIC :: */ + /* Indicates that a given face is italicized. */ + /* */ + /* FT_STYLE_FLAG_BOLD :: */ + /* Indicates that a given face is bold. */ + /* */ +#define FT_STYLE_FLAG_ITALIC ( 1 << 0 ) +#define FT_STYLE_FLAG_BOLD ( 1 << 1 ) + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Size_Internal */ + /* */ + /* <Description> */ + /* An opaque handle to an `FT_Size_InternalRec' structure, used to */ + /* model private data of a given FT_Size object. */ + /* */ + typedef struct FT_Size_InternalRec_* FT_Size_Internal; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_Metrics */ + /* */ + /* <Description> */ + /* The size metrics structure gives the metrics of a size object. */ + /* */ + /* <Fields> */ + /* x_ppem :: The width of the scaled EM square in pixels, hence */ + /* the term `ppem' (pixels per EM). It is also */ + /* referred to as `nominal width'. */ + /* */ + /* y_ppem :: The height of the scaled EM square in pixels, */ + /* hence the term `ppem' (pixels per EM). It is also */ + /* referred to as `nominal height'. */ + /* */ + /* x_scale :: A 16.16 fractional scaling value used to convert */ + /* horizontal metrics from font units to 26.6 */ + /* fractional pixels. Only relevant for scalable */ + /* font formats. */ + /* */ + /* y_scale :: A 16.16 fractional scaling value used to convert */ + /* vertical metrics from font units to 26.6 */ + /* fractional pixels. Only relevant for scalable */ + /* font formats. */ + /* */ + /* ascender :: The ascender in 26.6 fractional pixels. See */ + /* @FT_FaceRec for the details. */ + /* */ + /* descender :: The descender in 26.6 fractional pixels. See */ + /* @FT_FaceRec for the details. */ + /* */ + /* height :: The height in 26.6 fractional pixels. See */ + /* @FT_FaceRec for the details. */ + /* */ + /* max_advance :: The maximal advance width in 26.6 fractional */ + /* pixels. See @FT_FaceRec for the details. */ + /* */ + /* <Note> */ + /* The scaling values, if relevant, are determined first during a */ + /* size changing operation. The remaining fields are then set by the */ + /* driver. For scalable formats, they are usually set to scaled */ + /* values of the corresponding fields in @FT_FaceRec. */ + /* */ + /* Note that due to glyph hinting, these values might not be exact */ + /* for certain fonts. Thus they must be treated as unreliable */ + /* with an error margin of at least one pixel! */ + /* */ + /* Indeed, the only way to get the exact metrics is to render _all_ */ + /* glyphs. As this would be a definite performance hit, it is up to */ + /* client applications to perform such computations. */ + /* */ + /* The FT_Size_Metrics structure is valid for bitmap fonts also. */ + /* */ + typedef struct FT_Size_Metrics_ + { + FT_UShort x_ppem; /* horizontal pixels per EM */ + FT_UShort y_ppem; /* vertical pixels per EM */ + + FT_Fixed x_scale; /* scaling values used to convert font */ + FT_Fixed y_scale; /* units to 26.6 fractional pixels */ + + FT_Pos ascender; /* ascender in 26.6 frac. pixels */ + FT_Pos descender; /* descender in 26.6 frac. pixels */ + FT_Pos height; /* text height in 26.6 frac. pixels */ + FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */ + + } FT_Size_Metrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SizeRec */ + /* */ + /* <Description> */ + /* FreeType root size class structure. A size object models a face */ + /* object at a given size. */ + /* */ + /* <Fields> */ + /* face :: Handle to the parent face object. */ + /* */ + /* generic :: A typeless pointer, which is unused by the FreeType */ + /* library or any of its drivers. It can be used by */ + /* client applications to link their own data to each size */ + /* object. */ + /* */ + /* metrics :: Metrics for this size object. This field is read-only. */ + /* */ + typedef struct FT_SizeRec_ + { + FT_Face face; /* parent face object */ + FT_Generic generic; /* generic pointer for client uses */ + FT_Size_Metrics metrics; /* size metrics */ + FT_Size_Internal internal; + + } FT_SizeRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SubGlyph */ + /* */ + /* <Description> */ + /* The subglyph structure is an internal object used to describe */ + /* subglyphs (for example, in the case of composites). */ + /* */ + /* <Note> */ + /* The subglyph implementation is not part of the high-level API, */ + /* hence the forward structure declaration. */ + /* */ + /* You can however retrieve subglyph information with */ + /* @FT_Get_SubGlyph_Info. */ + /* */ + typedef struct FT_SubGlyphRec_* FT_SubGlyph; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Slot_Internal */ + /* */ + /* <Description> */ + /* An opaque handle to an `FT_Slot_InternalRec' structure, used to */ + /* model private data of a given FT_GlyphSlot object. */ + /* */ + typedef struct FT_Slot_InternalRec_* FT_Slot_Internal; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_GlyphSlotRec */ + /* */ + /* <Description> */ + /* FreeType root glyph slot class structure. A glyph slot is a */ + /* container where individual glyphs can be loaded, be they in */ + /* outline or bitmap format. */ + /* */ + /* <Fields> */ + /* library :: A handle to the FreeType library instance */ + /* this slot belongs to. */ + /* */ + /* face :: A handle to the parent face object. */ + /* */ + /* next :: In some cases (like some font tools), several */ + /* glyph slots per face object can be a good */ + /* thing. As this is rare, the glyph slots are */ + /* listed through a direct, single-linked list */ + /* using its `next' field. */ + /* */ + /* generic :: A typeless pointer which is unused by the */ + /* FreeType library or any of its drivers. It */ + /* can be used by client applications to link */ + /* their own data to each glyph slot object. */ + /* */ + /* metrics :: The metrics of the last loaded glyph in the */ + /* slot. The returned values depend on the last */ + /* load flags (see the @FT_Load_Glyph API */ + /* function) and can be expressed either in 26.6 */ + /* fractional pixels or font units. */ + /* */ + /* Note that even when the glyph image is */ + /* transformed, the metrics are not. */ + /* */ + /* linearHoriAdvance :: The advance width of the unhinted glyph. */ + /* Its value is expressed in 16.16 fractional */ + /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */ + /* when loading the glyph. This field can be */ + /* important to perform correct WYSIWYG layout. */ + /* Only relevant for outline glyphs. */ + /* */ + /* linearVertAdvance :: The advance height of the unhinted glyph. */ + /* Its value is expressed in 16.16 fractional */ + /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */ + /* when loading the glyph. This field can be */ + /* important to perform correct WYSIWYG layout. */ + /* Only relevant for outline glyphs. */ + /* */ + /* advance :: This is the transformed advance width for the */ + /* glyph. */ + /* */ + /* format :: This field indicates the format of the image */ + /* contained in the glyph slot. Typically */ + /* @FT_GLYPH_FORMAT_BITMAP, */ + /* @FT_GLYPH_FORMAT_OUTLINE, or */ + /* @FT_GLYPH_FORMAT_COMPOSITE, but others are */ + /* possible. */ + /* */ + /* bitmap :: This field is used as a bitmap descriptor */ + /* when the slot format is */ + /* @FT_GLYPH_FORMAT_BITMAP. Note that the */ + /* address and content of the bitmap buffer can */ + /* change between calls of @FT_Load_Glyph and a */ + /* few other functions. */ + /* */ + /* bitmap_left :: This is the bitmap's left bearing expressed */ + /* in integer pixels. Of course, this is only */ + /* valid if the format is */ + /* @FT_GLYPH_FORMAT_BITMAP. */ + /* */ + /* bitmap_top :: This is the bitmap's top bearing expressed in */ + /* integer pixels. Remember that this is the */ + /* distance from the baseline to the top-most */ + /* glyph scanline, upwards y-coordinates being */ + /* *positive*. */ + /* */ + /* outline :: The outline descriptor for the current glyph */ + /* image if its format is */ + /* @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is */ + /* loaded, `outline' can be transformed, */ + /* distorted, embolded, etc. However, it must */ + /* not be freed. */ + /* */ + /* num_subglyphs :: The number of subglyphs in a composite glyph. */ + /* This field is only valid for the composite */ + /* glyph format that should normally only be */ + /* loaded with the @FT_LOAD_NO_RECURSE flag. */ + /* For now this is internal to FreeType. */ + /* */ + /* subglyphs :: An array of subglyph descriptors for */ + /* composite glyphs. There are `num_subglyphs' */ + /* elements in there. Currently internal to */ + /* FreeType. */ + /* */ + /* control_data :: Certain font drivers can also return the */ + /* control data for a given glyph image (e.g. */ + /* TrueType bytecode, Type 1 charstrings, etc.). */ + /* This field is a pointer to such data. */ + /* */ + /* control_len :: This is the length in bytes of the control */ + /* data. */ + /* */ + /* other :: Really wicked formats can use this pointer to */ + /* present their own glyph image to client */ + /* applications. Note that the application */ + /* needs to know about the image format. */ + /* */ + /* lsb_delta :: The difference between hinted and unhinted */ + /* left side bearing while autohinting is */ + /* active. Zero otherwise. */ + /* */ + /* rsb_delta :: The difference between hinted and unhinted */ + /* right side bearing while autohinting is */ + /* active. Zero otherwise. */ + /* */ + /* <Note> */ + /* If @FT_Load_Glyph is called with default flags (see */ + /* @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in */ + /* its native format (e.g., an outline glyph for TrueType and Type 1 */ + /* formats). */ + /* */ + /* This image can later be converted into a bitmap by calling */ + /* @FT_Render_Glyph. This function finds the current renderer for */ + /* the native image's format then invokes it. */ + /* */ + /* The renderer is in charge of transforming the native image through */ + /* the slot's face transformation fields, then convert it into a */ + /* bitmap that is returned in `slot->bitmap'. */ + /* */ + /* Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */ + /* to specify the position of the bitmap relative to the current pen */ + /* position (e.g., coordinates (0,0) on the baseline). Of course, */ + /* `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP. */ + /* */ + /* <Note> */ + /* Here a small pseudo code fragment which shows how to use */ + /* `lsb_delta' and `rsb_delta': */ + /* */ + /* { */ + /* FT_Pos origin_x = 0; */ + /* FT_Pos prev_rsb_delta = 0; */ + /* */ + /* */ + /* for all glyphs do */ + /* <compute kern between current and previous glyph and add it to */ + /* `origin_x'> */ + /* */ + /* <load glyph with `FT_Load_Glyph'> */ + /* */ + /* if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 ) */ + /* origin_x -= 64; */ + /* else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 ) */ + /* origin_x += 64; */ + /* */ + /* prev_rsb_delta = face->glyph->rsb_delta; */ + /* */ + /* <save glyph image, or render glyph, or ...> */ + /* */ + /* origin_x += face->glyph->advance.x; */ + /* endfor */ + /* } */ + /* */ + typedef struct FT_GlyphSlotRec_ + { + FT_Library library; + FT_Face face; + FT_GlyphSlot next; + FT_UInt reserved; /* retained for binary compatibility */ + FT_Generic generic; + + FT_Glyph_Metrics metrics; + FT_Fixed linearHoriAdvance; + FT_Fixed linearVertAdvance; + FT_Vector advance; + + FT_Glyph_Format format; + + FT_Bitmap bitmap; + FT_Int bitmap_left; + FT_Int bitmap_top; + + FT_Outline outline; + + FT_UInt num_subglyphs; + FT_SubGlyph subglyphs; + + void* control_data; + long control_len; + + FT_Pos lsb_delta; + FT_Pos rsb_delta; + + void* other; + + FT_Slot_Internal internal; + + } FT_GlyphSlotRec; + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* F U N C T I O N S */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Init_FreeType */ + /* */ + /* <Description> */ + /* Initialize a new FreeType library object. The set of modules */ + /* that are registered by this function is determined at build time. */ + /* */ + /* <Output> */ + /* alibrary :: A handle to a new library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Init_FreeType( FT_Library *alibrary ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_FreeType */ + /* */ + /* <Description> */ + /* Destroy a given FreeType library object and all of its children, */ + /* including resources, drivers, faces, sizes, etc. */ + /* */ + /* <Input> */ + /* library :: A handle to the target library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_FreeType( FT_Library library ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_OPEN_XXX */ + /* */ + /* <Description> */ + /* A list of bit-field constants used within the `flags' field of the */ + /* @FT_Open_Args structure. */ + /* */ + /* <Values> */ + /* FT_OPEN_MEMORY :: This is a memory-based stream. */ + /* */ + /* FT_OPEN_STREAM :: Copy the stream from the `stream' field. */ + /* */ + /* FT_OPEN_PATHNAME :: Create a new input stream from a C */ + /* path name. */ + /* */ + /* FT_OPEN_DRIVER :: Use the `driver' field. */ + /* */ + /* FT_OPEN_PARAMS :: Use the `num_params' and `params' fields. */ + /* */ + /* ft_open_memory :: Deprecated; use @FT_OPEN_MEMORY instead. */ + /* */ + /* ft_open_stream :: Deprecated; use @FT_OPEN_STREAM instead. */ + /* */ + /* ft_open_pathname :: Deprecated; use @FT_OPEN_PATHNAME instead. */ + /* */ + /* ft_open_driver :: Deprecated; use @FT_OPEN_DRIVER instead. */ + /* */ + /* ft_open_params :: Deprecated; use @FT_OPEN_PARAMS instead. */ + /* */ + /* <Note> */ + /* The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME' */ + /* flags are mutually exclusive. */ + /* */ +#define FT_OPEN_MEMORY 0x1 +#define FT_OPEN_STREAM 0x2 +#define FT_OPEN_PATHNAME 0x4 +#define FT_OPEN_DRIVER 0x8 +#define FT_OPEN_PARAMS 0x10 + +#define ft_open_memory FT_OPEN_MEMORY /* deprecated */ +#define ft_open_stream FT_OPEN_STREAM /* deprecated */ +#define ft_open_pathname FT_OPEN_PATHNAME /* deprecated */ +#define ft_open_driver FT_OPEN_DRIVER /* deprecated */ +#define ft_open_params FT_OPEN_PARAMS /* deprecated */ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Parameter */ + /* */ + /* <Description> */ + /* A simple structure used to pass more or less generic parameters */ + /* to @FT_Open_Face. */ + /* */ + /* <Fields> */ + /* tag :: A four-byte identification tag. */ + /* */ + /* data :: A pointer to the parameter data. */ + /* */ + /* <Note> */ + /* The ID and function of parameters are driver-specific. */ + /* */ + typedef struct FT_Parameter_ + { + FT_ULong tag; + FT_Pointer data; + + } FT_Parameter; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Open_Args */ + /* */ + /* <Description> */ + /* A structure used to indicate how to open a new font file or */ + /* stream. A pointer to such a structure can be used as a parameter */ + /* for the functions @FT_Open_Face and @FT_Attach_Stream. */ + /* */ + /* <Fields> */ + /* flags :: A set of bit flags indicating how to use the */ + /* structure. */ + /* */ + /* memory_base :: The first byte of the file in memory. */ + /* */ + /* memory_size :: The size in bytes of the file in memory. */ + /* */ + /* pathname :: A pointer to an 8-bit file pathname. */ + /* */ + /* stream :: A handle to a source stream object. */ + /* */ + /* driver :: This field is exclusively used by @FT_Open_Face; */ + /* it simply specifies the font driver to use to open */ + /* the face. If set to 0, FreeType tries to load the */ + /* face with each one of the drivers in its list. */ + /* */ + /* num_params :: The number of extra parameters. */ + /* */ + /* params :: Extra parameters passed to the font driver when */ + /* opening a new face. */ + /* */ + /* <Note> */ + /* The stream type is determined by the contents of `flags' which */ + /* are tested in the following order by @FT_Open_Face: */ + /* */ + /* If the `FT_OPEN_MEMORY' bit is set, assume that this is a */ + /* memory file of `memory_size' bytes, located at `memory_address'. */ + /* The data are are not copied, and the client is responsible for */ + /* releasing and destroying them _after_ the corresponding call to */ + /* @FT_Done_Face. */ + /* */ + /* Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a */ + /* custom input stream `stream' is used. */ + /* */ + /* Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this */ + /* is a normal file and use `pathname' to open it. */ + /* */ + /* If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to */ + /* open the file with the driver whose handler is in `driver'. */ + /* */ + /* If the `FT_OPEN_PARAMS' bit is set, the parameters given by */ + /* `num_params' and `params' is used. They are ignored otherwise. */ + /* */ + /* Ideally, both the `pathname' and `params' fields should be tagged */ + /* as `const'; this is missing for API backwards compatibility. With */ + /* other words, applications should treat them as read-only. */ + /* */ + typedef struct FT_Open_Args_ + { + FT_UInt flags; + const FT_Byte* memory_base; + FT_Long memory_size; + FT_String* pathname; + FT_Stream stream; + FT_Module driver; + FT_Int num_params; + FT_Parameter* params; + + } FT_Open_Args; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face */ + /* */ + /* <Description> */ + /* This function calls @FT_Open_Face to open a font by its pathname. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* pathname :: A path to the font file. */ + /* */ + /* face_index :: The index of the face within the font. The first */ + /* face has index 0. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. If `face_index' is */ + /* greater than or equal to zero, it must be non-NULL. */ + /* See @FT_Open_Face for more details. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face( FT_Library library, + const char* filepathname, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Memory_Face */ + /* */ + /* <Description> */ + /* This function calls @FT_Open_Face to open a font which has been */ + /* loaded into memory. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* file_base :: A pointer to the beginning of the font data. */ + /* */ + /* file_size :: The size of the memory chunk used by the font data. */ + /* */ + /* face_index :: The index of the face within the font. The first */ + /* face has index 0. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. If `face_index' is */ + /* greater than or equal to zero, it must be non-NULL. */ + /* See @FT_Open_Face for more details. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* You must not deallocate the memory before calling @FT_Done_Face. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Memory_Face( FT_Library library, + const FT_Byte* file_base, + FT_Long file_size, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Open_Face */ + /* */ + /* <Description> */ + /* Create a face object from a given resource described by */ + /* @FT_Open_Args. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* args :: A pointer to an `FT_Open_Args' structure which must */ + /* be filled by the caller. */ + /* */ + /* face_index :: The index of the face within the font. The first */ + /* face has index 0. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. If `face_index' is */ + /* greater than or equal to zero, it must be non-NULL. */ + /* See note below. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Unlike FreeType 1.x, this function automatically creates a glyph */ + /* slot for the face object which can be accessed directly through */ + /* `face->glyph'. */ + /* */ + /* FT_Open_Face can be used to quickly check whether the font */ + /* format of a given font resource is supported by FreeType. If the */ + /* `face_index' field is negative, the function's return value is 0 */ + /* if the font format is recognized, or non-zero otherwise; */ + /* the function returns a more or less empty face handle in `*aface' */ + /* (if `aface' isn't NULL). The only useful field in this special */ + /* case is `face->num_faces' which gives the number of faces within */ + /* the font file. After examination, the returned @FT_Face structure */ + /* should be deallocated with a call to @FT_Done_Face. */ + /* */ + /* Each new face object created with this function also owns a */ + /* default @FT_Size object, accessible as `face->size'. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Open_Face( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Attach_File */ + /* */ + /* <Description> */ + /* This function calls @FT_Attach_Stream to attach a file. */ + /* */ + /* <InOut> */ + /* face :: The target face object. */ + /* */ + /* <Input> */ + /* filepathname :: The pathname. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Attach_File( FT_Face face, + const char* filepathname ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Attach_Stream */ + /* */ + /* <Description> */ + /* `Attach' data to a face object. Normally, this is used to read */ + /* additional information for the face object. For example, you can */ + /* attach an AFM file that comes with a Type 1 font to get the */ + /* kerning values and other metrics. */ + /* */ + /* <InOut> */ + /* face :: The target face object. */ + /* */ + /* <Input> */ + /* parameters :: A pointer to @FT_Open_Args which must be filled by */ + /* the caller. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The meaning of the `attach' (i.e., what really happens when the */ + /* new file is read) is not fixed by FreeType itself. It really */ + /* depends on the font format (and thus the font driver). */ + /* */ + /* Client applications are expected to know what they are doing */ + /* when invoking this function. Most drivers simply do not implement */ + /* file attachments. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Attach_Stream( FT_Face face, + FT_Open_Args* parameters ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Face */ + /* */ + /* <Description> */ + /* Discard a given face object, as well as all of its child slots and */ + /* sizes. */ + /* */ + /* <Input> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_Face( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Select_Size */ + /* */ + /* <Description> */ + /* Select a bitmap strike. */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Input> */ + /* strike_index :: The index of the bitmap strike in the */ + /* `available_sizes' field of @FT_FaceRec structure. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Select_Size( FT_Face face, + FT_Int strike_index ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Size_Request_Type */ + /* */ + /* <Description> */ + /* An enumeration type that lists the supported size request types. */ + /* */ + /* <Values> */ + /* FT_SIZE_REQUEST_TYPE_NOMINAL :: */ + /* The nominal size. The `units_per_EM' field of @FT_FaceRec is */ + /* used to determine both scaling values. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_REAL_DIM :: */ + /* The real dimension. The sum of the the `Ascender' and (minus */ + /* of) the `Descender' fields of @FT_FaceRec are used to determine */ + /* both scaling values. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_BBOX :: */ + /* The font bounding box. The width and height of the `bbox' field */ + /* of @FT_FaceRec are used to determine the horizontal and vertical */ + /* scaling value, respectively. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_CELL :: */ + /* The `max_advance_width' field of @FT_FaceRec is used to */ + /* determine the horizontal scaling value; the vertical scaling */ + /* value is determined the same way as */ + /* @FT_SIZE_REQUEST_TYPE_REAL_DIM does. Finally, both scaling */ + /* values are set to the smaller one. This type is useful if you */ + /* want to specify the font size for, say, a window of a given */ + /* dimension and 80x24 cells. */ + /* */ + /* FT_SIZE_REQUEST_TYPE_SCALES :: */ + /* Specify the scaling values directly. */ + /* */ + /* <Note> */ + /* The above descriptions only apply to scalable formats. For bitmap */ + /* formats, the behaviour is up to the driver. */ + /* */ + /* See the note section of @FT_Size_Metrics if you wonder how size */ + /* requesting relates to scaling values. */ + /* */ + typedef enum FT_Size_Request_Type_ + { + FT_SIZE_REQUEST_TYPE_NOMINAL, + FT_SIZE_REQUEST_TYPE_REAL_DIM, + FT_SIZE_REQUEST_TYPE_BBOX, + FT_SIZE_REQUEST_TYPE_CELL, + FT_SIZE_REQUEST_TYPE_SCALES, + + FT_SIZE_REQUEST_TYPE_MAX + + } FT_Size_Request_Type; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Size_RequestRec */ + /* */ + /* <Description> */ + /* A structure used to model a size request. */ + /* */ + /* <Fields> */ + /* type :: See @FT_Size_Request_Type. */ + /* */ + /* width :: The desired width. */ + /* */ + /* height :: The desired height. */ + /* */ + /* horiResolution :: The horizontal resolution. If set to zero, */ + /* `width' is treated as a 26.6 fractional pixel */ + /* value. */ + /* */ + /* vertResolution :: The vertical resolution. If set to zero, */ + /* `height' is treated as a 26.6 fractional pixel */ + /* value. */ + /* */ + /* <Note> */ + /* If `width' is zero, then the horizontal scaling value is set */ + /* equal to the vertical scaling value, and vice versa. */ + /* */ + typedef struct FT_Size_RequestRec_ + { + FT_Size_Request_Type type; + FT_Long width; + FT_Long height; + FT_UInt horiResolution; + FT_UInt vertResolution; + + } FT_Size_RequestRec, *FT_Size_Request; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Request_Size */ + /* */ + /* <Description> */ + /* Resize the scale of the active @FT_Size object in a face. */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Input> */ + /* req :: A pointer to a @FT_Size_RequestRec. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Although drivers may select the bitmap strike matching the */ + /* request, you should not rely on this if you intend to select a */ + /* particular bitmap strike. Use @FT_Select_Size instead in that */ + /* case. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Request_Size( FT_Face face, + FT_Size_Request req ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Char_Size */ + /* */ + /* <Description> */ + /* This function calls @FT_Request_Size to request the nominal size */ + /* (in points). */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object. */ + /* */ + /* <Input> */ + /* char_width :: The nominal width, in 26.6 fractional points. */ + /* */ + /* char_height :: The nominal height, in 26.6 fractional points. */ + /* */ + /* horz_resolution :: The horizontal resolution in dpi. */ + /* */ + /* vert_resolution :: The vertical resolution in dpi. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* If either the character width or height is zero, it is set equal */ + /* to the other value. */ + /* */ + /* If either the horizontal or vertical resolution is zero, it is set */ + /* equal to the other value. */ + /* */ + /* A character width or height smaller than 1pt is set to 1pt; if */ + /* both resolution values are zero, they are set to 72dpi. */ + /* */ + + FT_EXPORT( FT_Error ) + FT_Set_Char_Size( FT_Face face, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Pixel_Sizes */ + /* */ + /* <Description> */ + /* This function calls @FT_Request_Size to request the nominal size */ + /* (in pixels). */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Input> */ + /* pixel_width :: The nominal width, in pixels. */ + /* */ + /* pixel_height :: The nominal height, in pixels. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Pixel_Sizes( FT_Face face, + FT_UInt pixel_width, + FT_UInt pixel_height ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Load_Glyph */ + /* */ + /* <Description> */ + /* A function used to load a single glyph into the glyph slot of a */ + /* face object. */ + /* */ + /* <InOut> */ + /* face :: A handle to the target face object where the glyph */ + /* is loaded. */ + /* */ + /* <Input> */ + /* glyph_index :: The index of the glyph in the font file. For */ + /* CID-keyed fonts (either in PS or in CFF format) */ + /* this argument specifies the CID value. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* @FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The loaded glyph may be transformed. See @FT_Set_Transform for */ + /* the details. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Load_Char */ + /* */ + /* <Description> */ + /* A function used to load a single glyph into the glyph slot of a */ + /* face object, according to its character code. */ + /* */ + /* <InOut> */ + /* face :: A handle to a target face object where the glyph */ + /* is loaded. */ + /* */ + /* <Input> */ + /* char_code :: The glyph's character code, according to the */ + /* current charmap used in the face. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* @FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int32 load_flags ); + + + /************************************************************************* + * + * @enum: + * FT_LOAD_XXX + * + * @description: + * A list of bit-field constants used with @FT_Load_Glyph to indicate + * what kind of operations to perform during glyph loading. + * + * @values: + * FT_LOAD_DEFAULT :: + * Corresponding to 0, this value is used as the default glyph load + * operation. In this case, the following happens: + * + * 1. FreeType looks for a bitmap for the glyph corresponding to the + * face's current size. If one is found, the function returns. + * The bitmap data can be accessed from the glyph slot (see note + * below). + * + * 2. If no embedded bitmap is searched or found, FreeType looks for a + * scalable outline. If one is found, it is loaded from the font + * file, scaled to device pixels, then `hinted' to the pixel grid + * in order to optimize it. The outline data can be accessed from + * the glyph slot (see note below). + * + * Note that by default, the glyph loader doesn't render outlines into + * bitmaps. The following flags are used to modify this default + * behaviour to more specific and useful cases. + * + * FT_LOAD_NO_SCALE :: + * Don't scale the outline glyph loaded, but keep it in font units. + * + * This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and + * unsets @FT_LOAD_RENDER. + * + * FT_LOAD_NO_HINTING :: + * Disable hinting. This generally generates `blurrier' bitmap glyph + * when the glyph is rendered in any of the anti-aliased modes. See + * also the note below. + * + * This flag is implied by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_RENDER :: + * Call @FT_Render_Glyph after the glyph is loaded. By default, the + * glyph is rendered in @FT_RENDER_MODE_NORMAL mode. This can be + * overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME. + * + * This flag is unset by @FT_LOAD_NO_SCALE. + * + * FT_LOAD_NO_BITMAP :: + * Ignore bitmap strikes when loading. Bitmap-only fonts ignore this + * flag. + * + * @FT_LOAD_NO_SCALE always sets this flag. + * + * FT_LOAD_VERTICAL_LAYOUT :: + * Load the glyph for vertical text layout. _Don't_ use it as it is + * problematic currently. + * + * FT_LOAD_FORCE_AUTOHINT :: + * Indicates that the auto-hinter is preferred over the font's native + * hinter. See also the note below. + * + * FT_LOAD_CROP_BITMAP :: + * Indicates that the font driver should crop the loaded bitmap glyph + * (i.e., remove all space around its black bits). Not all drivers + * implement this. + * + * FT_LOAD_PEDANTIC :: + * Indicates that the font driver should perform pedantic verifications + * during glyph loading. This is mostly used to detect broken glyphs + * in fonts. By default, FreeType tries to handle broken fonts also. + * + * FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH :: + * Indicates that the font driver should ignore the global advance + * width defined in the font. By default, that value is used as the + * advance width for all glyphs when the face has + * @FT_FACE_FLAG_FIXED_WIDTH set. + * + * This flag exists for historical reasons (to support buggy CJK + * fonts). + * + * FT_LOAD_NO_RECURSE :: + * This flag is only used internally. It merely indicates that the + * font driver should not load composite glyphs recursively. Instead, + * it should set the `num_subglyph' and `subglyphs' values of the + * glyph slot accordingly, and set `glyph->format' to + * @FT_GLYPH_FORMAT_COMPOSITE. + * + * The description of sub-glyphs is not available to client + * applications for now. + * + * This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM. + * + * FT_LOAD_IGNORE_TRANSFORM :: + * Indicates that the transform matrix set by @FT_Set_Transform should + * be ignored. + * + * FT_LOAD_MONOCHROME :: + * This flag is used with @FT_LOAD_RENDER to indicate that you want to + * render an outline glyph to a 1-bit monochrome bitmap glyph, with + * 8 pixels packed into each byte of the bitmap data. + * + * Note that this has no effect on the hinting algorithm used. You + * should use @FT_LOAD_TARGET_MONO instead so that the + * monochrome-optimized hinting algorithm is used. + * + * FT_LOAD_LINEAR_DESIGN :: + * Indicates that the `linearHoriAdvance' and `linearVertAdvance' + * fields of @FT_GlyphSlotRec should be kept in font units. See + * @FT_GlyphSlotRec for details. + * + * FT_LOAD_NO_AUTOHINT :: + * Disable auto-hinter. See also the note below. + * + * @note: + * By default, hinting is enabled and the font's native hinter (see + * @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter. You can + * disable hinting by setting @FT_LOAD_NO_HINTING or change the + * precedence by setting @FT_LOAD_FORCE_AUTOHINT. You can also set + * @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be + * used at all. + * + * Besides deciding which hinter to use, you can also decide which + * hinting algorithm to use. See @FT_LOAD_TARGET_XXX for details. + */ +#define FT_LOAD_DEFAULT 0x0 +#define FT_LOAD_NO_SCALE 0x1 +#define FT_LOAD_NO_HINTING 0x2 +#define FT_LOAD_RENDER 0x4 +#define FT_LOAD_NO_BITMAP 0x8 +#define FT_LOAD_VERTICAL_LAYOUT 0x10 +#define FT_LOAD_FORCE_AUTOHINT 0x20 +#define FT_LOAD_CROP_BITMAP 0x40 +#define FT_LOAD_PEDANTIC 0x80 +#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH 0x200 +#define FT_LOAD_NO_RECURSE 0x400 +#define FT_LOAD_IGNORE_TRANSFORM 0x800 +#define FT_LOAD_MONOCHROME 0x1000 +#define FT_LOAD_LINEAR_DESIGN 0x2000 + + /* temporary hack! */ +#define FT_LOAD_SBITS_ONLY 0x4000 +#define FT_LOAD_NO_AUTOHINT 0x8000U + + /* */ + + + /************************************************************************** + * + * @enum: + * FT_LOAD_TARGET_XXX + * + * @description: + * A list of values that are used to select a specific hinting algorithm + * to use by the hinter. You should OR one of these values to your + * `load_flags' when calling @FT_Load_Glyph. + * + * Note that font's native hinters may ignore the hinting algorithm you + * have specified (e.g., the TrueType bytecode interpreter). You can set + * @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used. + * + * Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it + * always implies @FT_LOAD_FORCE_AUTOHINT. + * + * @values: + * FT_LOAD_TARGET_NORMAL :: + * This corresponds to the default hinting algorithm, optimized for + * standard gray-level rendering. For monochrome output, use + * @FT_LOAD_TARGET_MONO instead. + * + * FT_LOAD_TARGET_LIGHT :: + * A lighter hinting algorithm for non-monochrome modes. Many + * generated glyphs are more fuzzy but better resemble its original + * shape. A bit like rendering on Mac OS X. + * + * As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT. + * + * FT_LOAD_TARGET_MONO :: + * Strong hinting algorithm that should only be used for monochrome + * output. The result is probably unpleasant if the glyph is rendered + * in non-monochrome modes. + * + * FT_LOAD_TARGET_LCD :: + * A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally + * decimated LCD displays. + * + * FT_LOAD_TARGET_LCD_V :: + * A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically + * decimated LCD displays. + * + * @note: + * You should use only _one_ of the FT_LOAD_TARGET_XXX values in your + * `load_flags'. They can't be ORed. + * + * If @FT_LOAD_RENDER is also set, the glyph is rendered in the + * corresponding mode (i.e., the mode which matches the used algorithm + * best) unless @FT_LOAD_MONOCHROME is set. + * + * You can use a hinting algorithm that doesn't correspond to the same + * rendering mode. As an example, it is possible to use the `light' + * hinting algorithm and have the results rendered in horizontal LCD + * pixel mode, with code like + * + * { + * FT_Load_Glyph( face, glyph_index, + * load_flags | FT_LOAD_TARGET_LIGHT ); + * + * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD ); + * } + */ + +#define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 ) + +#define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL ) +#define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT ) +#define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO ) +#define FT_LOAD_TARGET_LCD FT_LOAD_TARGET_( FT_RENDER_MODE_LCD ) +#define FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V ) + + + /* + * @macro: + * FT_LOAD_TARGET_MODE + * + * @description: + * Return the @FT_Render_Mode corresponding to a given + * @FT_LOAD_TARGET_XXX value. + */ + +#define FT_LOAD_TARGET_MODE( x ) ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) ) + + /* */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Transform */ + /* */ + /* <Description> */ + /* A function used to set the transformation that is applied to glyph */ + /* images when they are loaded into a glyph slot through */ + /* @FT_Load_Glyph. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to the transformation's 2x2 matrix. Use 0 for */ + /* the identity matrix. */ + /* delta :: A pointer to the translation vector. Use 0 for the null */ + /* vector. */ + /* */ + /* <Note> */ + /* The transformation is only applied to scalable image formats after */ + /* the glyph has been loaded. It means that hinting is unaltered by */ + /* the transformation and is performed on the character size given in */ + /* the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes. */ + /* */ + /* Note that this also transforms the `face.glyph.advance' field, but */ + /* *not* the values in `face.glyph.metrics'. */ + /* */ + FT_EXPORT( void ) + FT_Set_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Render_Mode */ + /* */ + /* <Description> */ + /* An enumeration type that lists the render modes supported by */ + /* FreeType 2. Each mode corresponds to a specific type of scanline */ + /* conversion performed on the outline. */ + /* */ + /* For bitmap fonts the `bitmap->pixel_mode' field in the */ + /* @FT_GlyphSlotRec structure gives the format of the returned */ + /* bitmap. */ + /* */ + /* <Values> */ + /* FT_RENDER_MODE_NORMAL :: */ + /* This is the default render mode; it corresponds to 8-bit */ + /* anti-aliased bitmaps, using 256 levels of opacity. */ + /* */ + /* FT_RENDER_MODE_LIGHT :: */ + /* This is equivalent to @FT_RENDER_MODE_NORMAL. It is only */ + /* defined as a separate value because render modes are also used */ + /* indirectly to define hinting algorithm selectors. See */ + /* @FT_LOAD_TARGET_XXX for details. */ + /* */ + /* FT_RENDER_MODE_MONO :: */ + /* This mode corresponds to 1-bit bitmaps. */ + /* */ + /* FT_RENDER_MODE_LCD :: */ + /* This mode corresponds to horizontal RGB and BGR sub-pixel */ + /* displays, like LCD-screens. It produces 8-bit bitmaps that are */ + /* 3 times the width of the original glyph outline in pixels, and */ + /* which use the @FT_PIXEL_MODE_LCD mode. */ + /* */ + /* FT_RENDER_MODE_LCD_V :: */ + /* This mode corresponds to vertical RGB and BGR sub-pixel displays */ + /* (like PDA screens, rotated LCD displays, etc.). It produces */ + /* 8-bit bitmaps that are 3 times the height of the original */ + /* glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode. */ + /* */ + /* <Note> */ + /* The LCD-optimized glyph bitmaps produced by FT_Render_Glyph are */ + /* _not_ _filtered_ to reduce color-fringes. It is up to the caller */ + /* to perform this pass. */ + /* */ + typedef enum FT_Render_Mode_ + { + FT_RENDER_MODE_NORMAL = 0, + FT_RENDER_MODE_LIGHT, + FT_RENDER_MODE_MONO, + FT_RENDER_MODE_LCD, + FT_RENDER_MODE_LCD_V, + + FT_RENDER_MODE_MAX + + } FT_Render_Mode; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_render_mode_xxx */ + /* */ + /* <Description> */ + /* These constants are deprecated. Use the corresponding */ + /* @FT_Render_Mode values instead. */ + /* */ + /* <Values> */ + /* ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL */ + /* ft_render_mode_mono :: see @FT_RENDER_MODE_MONO */ + /* */ +#define ft_render_mode_normal FT_RENDER_MODE_NORMAL +#define ft_render_mode_mono FT_RENDER_MODE_MONO + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Render_Glyph */ + /* */ + /* <Description> */ + /* Convert a given glyph image to a bitmap. It does so by inspecting */ + /* the glyph image format, finding the relevant renderer, and */ + /* invoking it. */ + /* */ + /* <InOut> */ + /* slot :: A handle to the glyph slot containing the image to */ + /* convert. */ + /* */ + /* <Input> */ + /* render_mode :: This is the render mode used to render the glyph */ + /* image into a bitmap. See @FT_Render_Mode for a */ + /* list of possible values. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Render_Glyph( FT_GlyphSlot slot, + FT_Render_Mode render_mode ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Kerning_Mode */ + /* */ + /* <Description> */ + /* An enumeration used to specify which kerning values to return in */ + /* @FT_Get_Kerning. */ + /* */ + /* <Values> */ + /* FT_KERNING_DEFAULT :: Return scaled and grid-fitted kerning */ + /* distances (value is 0). */ + /* */ + /* FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning */ + /* distances. */ + /* */ + /* FT_KERNING_UNSCALED :: Return the kerning vector in original font */ + /* units. */ + /* */ + typedef enum FT_Kerning_Mode_ + { + FT_KERNING_DEFAULT = 0, + FT_KERNING_UNFITTED, + FT_KERNING_UNSCALED + + } FT_Kerning_Mode; + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* ft_kerning_default */ + /* */ + /* <Description> */ + /* This constant is deprecated. Please use @FT_KERNING_DEFAULT */ + /* instead. */ + /* */ +#define ft_kerning_default FT_KERNING_DEFAULT + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* ft_kerning_unfitted */ + /* */ + /* <Description> */ + /* This constant is deprecated. Please use @FT_KERNING_UNFITTED */ + /* instead. */ + /* */ +#define ft_kerning_unfitted FT_KERNING_UNFITTED + + + /*************************************************************************/ + /* */ + /* <Const> */ + /* ft_kerning_unscaled */ + /* */ + /* <Description> */ + /* This constant is deprecated. Please use @FT_KERNING_UNSCALED */ + /* instead. */ + /* */ +#define ft_kerning_unscaled FT_KERNING_UNSCALED + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Kerning */ + /* */ + /* <Description> */ + /* Return the kerning vector between two glyphs of a same face. */ + /* */ + /* <Input> */ + /* face :: A handle to a source face object. */ + /* */ + /* left_glyph :: The index of the left glyph in the kern pair. */ + /* */ + /* right_glyph :: The index of the right glyph in the kern pair. */ + /* */ + /* kern_mode :: See @FT_Kerning_Mode for more information. */ + /* Determines the scale and dimension of the returned */ + /* kerning vector. */ + /* */ + /* <Output> */ + /* akerning :: The kerning vector. This is either in font units */ + /* or in pixels (26.6 format) for scalable formats, */ + /* and in pixels for fixed-sizes formats. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* Only horizontal layouts (left-to-right & right-to-left) are */ + /* supported by this method. Other layouts, or more sophisticated */ + /* kernings, are out of the scope of this API function -- they can be */ + /* implemented through format-specific interfaces. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Kerning( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_UInt kern_mode, + FT_Vector *akerning ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Track_Kerning */ + /* */ + /* <Description> */ + /* Return the track kerning for a given face object at a given size. */ + /* */ + /* <Input> */ + /* face :: A handle to a source face object. */ + /* */ + /* point_size :: The point size in 16.16 fractional points. */ + /* */ + /* degree :: The degree of tightness. */ + /* */ + /* <Output> */ + /* akerning :: The kerning in 16.16 fractional points. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Track_Kerning( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Glyph_Name */ + /* */ + /* <Description> */ + /* Retrieve the ASCII name of a given glyph in a face. This only */ + /* works for those faces where @FT_HAS_GLYPH_NAMES(face) returns 1. */ + /* */ + /* <Input> */ + /* face :: A handle to a source face object. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* buffer_max :: The maximal number of bytes available in the */ + /* buffer. */ + /* */ + /* <Output> */ + /* buffer :: A pointer to a target buffer where the name is */ + /* copied to. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* An error is returned if the face doesn't provide glyph names or if */ + /* the glyph index is invalid. In all cases of failure, the first */ + /* byte of `buffer' is set to 0 to indicate an empty name. */ + /* */ + /* The glyph name is truncated to fit within the buffer if it is too */ + /* long. The returned string is always zero-terminated. */ + /* */ + /* This function is not compiled within the library if the config */ + /* macro `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is defined in */ + /* `include/freetype/config/ftoptions.h'. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph_Name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Postscript_Name */ + /* */ + /* <Description> */ + /* Retrieve the ASCII Postscript name of a given face, if available. */ + /* This only works with Postscript and TrueType fonts. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Return> */ + /* A pointer to the face's Postscript name. NULL if unavailable. */ + /* */ + /* <Note> */ + /* The returned pointer is owned by the face and is destroyed with */ + /* it. */ + /* */ + FT_EXPORT( const char* ) + FT_Get_Postscript_Name( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Select_Charmap */ + /* */ + /* <Description> */ + /* Select a given charmap by its encoding tag (as listed in */ + /* `freetype.h'). */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Input> */ + /* encoding :: A handle to the selected encoding. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function returns an error if no charmap in the face */ + /* corresponds to the encoding queried here. */ + /* */ + /* Because many fonts contain more than a single cmap for Unicode */ + /* encoding, this function has some special code to select the one */ + /* which covers Unicode best. It is thus preferable to */ + /* @FT_Set_Charmap in this case. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Select_Charmap( FT_Face face, + FT_Encoding encoding ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Charmap */ + /* */ + /* <Description> */ + /* Select a given charmap for character code to glyph index mapping. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Input> */ + /* charmap :: A handle to the selected charmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function returns an error if the charmap is not part of */ + /* the face (i.e., if it is not listed in the `face->charmaps' */ + /* table). */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Charmap( FT_Face face, + FT_CharMap charmap ); + + + /************************************************************************* + * + * @function: + * FT_Get_Charmap_Index + * + * @description: + * Retrieve index of a given charmap. + * + * @input: + * charmap :: + * A handle to a charmap. + * + * @return: + * The index into the array of character maps within the face to which + * `charmap' belongs. + * + */ + FT_EXPORT( FT_Int ) + FT_Get_Charmap_Index( FT_CharMap charmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Char_Index */ + /* */ + /* <Description> */ + /* Return the glyph index of a given character code. This function */ + /* uses a charmap object to do the mapping. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* charcode :: The character code. */ + /* */ + /* <Return> */ + /* The glyph index. 0 means `undefined character code'. */ + /* */ + /* <Note> */ + /* If you use FreeType to manipulate the contents of font files */ + /* directly, be aware that the glyph index returned by this function */ + /* doesn't always correspond to the internal indices used within */ + /* the file. This is done to ensure that value 0 always corresponds */ + /* to the `missing glyph'. */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_First_Char */ + /* */ + /* <Description> */ + /* This function is used to return the first character code in the */ + /* current charmap of a given face. It also returns the */ + /* corresponding glyph index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* <Output> */ + /* agindex :: Glyph index of first character code. 0 if charmap is */ + /* empty. */ + /* */ + /* <Return> */ + /* The charmap's first character code. */ + /* */ + /* <Note> */ + /* You should use this function with @FT_Get_Next_Char to be able to */ + /* parse all character codes available in a given charmap. The code */ + /* should look like this: */ + /* */ + /* { */ + /* FT_ULong charcode; */ + /* FT_UInt gindex; */ + /* */ + /* */ + /* charcode = FT_Get_First_Char( face, &gindex ); */ + /* while ( gindex != 0 ) */ + /* { */ + /* ... do something with (charcode,gindex) pair ... */ + /* */ + /* charcode = FT_Get_Next_Char( face, charcode, &gindex ); */ + /* } */ + /* } */ + /* */ + /* Note that `*agindex' is set to 0 if the charmap is empty. The */ + /* result itself can be 0 in two cases: if the charmap is empty or */ + /* when the value 0 is the first valid character code. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_First_Char( FT_Face face, + FT_UInt *agindex ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Next_Char */ + /* */ + /* <Description> */ + /* This function is used to return the next character code in the */ + /* current charmap of a given face following the value `char_code', */ + /* as well as the corresponding glyph index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* char_code :: The starting character code. */ + /* */ + /* <Output> */ + /* agindex :: Glyph index of first character code. 0 if charmap */ + /* is empty. */ + /* */ + /* <Return> */ + /* The charmap's next character code. */ + /* */ + /* <Note> */ + /* You should use this function with @FT_Get_First_Char to walk */ + /* over all character codes available in a given charmap. See the */ + /* note for this function for a simple code example. */ + /* */ + /* Note that `*agindex' is set to 0 when there are no more codes in */ + /* the charmap. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_Next_Char( FT_Face face, + FT_ULong char_code, + FT_UInt *agindex ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Name_Index */ + /* */ + /* <Description> */ + /* Return the glyph index of a given glyph name. This function uses */ + /* driver specific objects to do the translation. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face object. */ + /* */ + /* glyph_name :: The glyph name. */ + /* */ + /* <Return> */ + /* The glyph index. 0 means `undefined character code'. */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Get_Name_Index( FT_Face face, + FT_String* glyph_name ); + + + /************************************************************************* + * + * @macro: + * FT_SUBGLYPH_FLAG_XXX + * + * @description: + * A list of constants used to describe subglyphs. Please refer to the + * TrueType specification for the meaning of the various flags. + * + * @values: + * FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS :: + * FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES :: + * FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID :: + * FT_SUBGLYPH_FLAG_SCALE :: + * FT_SUBGLYPH_FLAG_XY_SCALE :: + * FT_SUBGLYPH_FLAG_2X2 :: + * FT_SUBGLYPH_FLAG_USE_MY_METRICS :: + * + */ +#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 +#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 +#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 +#define FT_SUBGLYPH_FLAG_SCALE 8 +#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 +#define FT_SUBGLYPH_FLAG_2X2 0x80 +#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 + + + /************************************************************************* + * + * @func: + * FT_Get_SubGlyph_Info + * + * @description: + * Retrieve a description of a given subglyph. Only use it if + * `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE, or an error is + * returned. + * + * @input: + * glyph :: + * The source glyph slot. + * + * sub_index :: + * The index of subglyph. Must be less than `glyph->num_subglyphs'. + * + * @output: + * p_index :: + * The glyph index of the subglyph. + * + * p_flags :: + * The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX. + * + * p_arg1 :: + * The subglyph's first argument (if any). + * + * p_arg2 :: + * The subglyph's second argument (if any). + * + * p_transform :: + * The subglyph transformation (if any). + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The values of `*p_arg1', `*p_arg2', and `*p_transform' must be + * interpreted depending on the flags returned in `*p_flags'. See the + * TrueType specification for details. + * + */ + FT_EXPORT( FT_Error ) + FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, + FT_UInt sub_index, + FT_Int *p_index, + FT_UInt *p_flags, + FT_Int *p_arg1, + FT_Int *p_arg2, + FT_Matrix *p_transform ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* computations */ + /* */ + /* <Title> */ + /* Computations */ + /* */ + /* <Abstract> */ + /* Crunching fixed numbers and vectors. */ + /* */ + /* <Description> */ + /* This section contains various functions used to perform */ + /* computations on 16.16 fixed-float numbers or 2d vectors. */ + /* */ + /* <Order> */ + /* FT_MulDiv */ + /* FT_MulFix */ + /* FT_DivFix */ + /* FT_RoundFix */ + /* FT_CeilFix */ + /* FT_FloorFix */ + /* FT_Vector_Transform */ + /* FT_Matrix_Multiply */ + /* FT_Matrix_Invert */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_MulDiv */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation `(a*b)/c' */ + /* with maximal accuracy (it uses a 64-bit intermediate integer */ + /* whenever necessary). */ + /* */ + /* This function isn't necessarily as fast as some processor specific */ + /* operations, but is at least completely portable. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. */ + /* c :: The divisor. */ + /* */ + /* <Return> */ + /* The result of `(a*b)/c'. This function never traps when trying to */ + /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ + /* on the signs of `a' and `b'. */ + /* */ + FT_EXPORT( FT_Long ) + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_MulFix */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation */ + /* `(a*b)/0x10000' with maximal accuracy. Most of the time this is */ + /* used to multiply a given value by a 16.16 fixed float factor. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. Use a 16.16 factor here whenever */ + /* possible (see note below). */ + /* */ + /* <Return> */ + /* The result of `(a*b)/0x10000'. */ + /* */ + /* <Note> */ + /* This function has been optimized for the case where the absolute */ + /* value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */ + /* As this happens mainly when scaling from notional units to */ + /* fractional pixels in FreeType, it resulted in noticeable speed */ + /* improvements between versions 2.x and 1.x. */ + /* */ + /* As a conclusion, always try to place a 16.16 factor as the */ + /* _second_ argument of this function; this can make a great */ + /* difference. */ + /* */ + FT_EXPORT( FT_Long ) + FT_MulFix( FT_Long a, + FT_Long b ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_DivFix */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation */ + /* `(a*0x10000)/b' with maximal accuracy. Most of the time, this is */ + /* used to divide a given value by a 16.16 fixed float factor. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. Use a 16.16 factor here whenever */ + /* possible (see note below). */ + /* */ + /* <Return> */ + /* The result of `(a*0x10000)/b'. */ + /* */ + /* <Note> */ + /* The optimization for FT_DivFix() is simple: If (a << 16) fits in */ + /* 32 bits, then the division is computed directly. Otherwise, we */ + /* use a specialized version of @FT_MulDiv. */ + /* */ + FT_EXPORT( FT_Long ) + FT_DivFix( FT_Long a, + FT_Long b ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_RoundFix */ + /* */ + /* <Description> */ + /* A very simple function used to round a 16.16 fixed number. */ + /* */ + /* <Input> */ + /* a :: The number to be rounded. */ + /* */ + /* <Return> */ + /* The result of `(a + 0x8000) & -0x10000'. */ + /* */ + FT_EXPORT( FT_Fixed ) + FT_RoundFix( FT_Fixed a ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_CeilFix */ + /* */ + /* <Description> */ + /* A very simple function used to compute the ceiling function of a */ + /* 16.16 fixed number. */ + /* */ + /* <Input> */ + /* a :: The number for which the ceiling function is to be computed. */ + /* */ + /* <Return> */ + /* The result of `(a + 0x10000 - 1) & -0x10000'. */ + /* */ + FT_EXPORT( FT_Fixed ) + FT_CeilFix( FT_Fixed a ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_FloorFix */ + /* */ + /* <Description> */ + /* A very simple function used to compute the floor function of a */ + /* 16.16 fixed number. */ + /* */ + /* <Input> */ + /* a :: The number for which the floor function is to be computed. */ + /* */ + /* <Return> */ + /* The result of `a & -0x10000'. */ + /* */ + FT_EXPORT( FT_Fixed ) + FT_FloorFix( FT_Fixed a ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Vector_Transform */ + /* */ + /* <Description> */ + /* Transform a single vector through a 2x2 matrix. */ + /* */ + /* <InOut> */ + /* vector :: The target vector to transform. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to the source 2x2 matrix. */ + /* */ + /* <Note> */ + /* The result is undefined if either `vector' or `matrix' is invalid. */ + /* */ + FT_EXPORT( void ) + FT_Vector_Transform( FT_Vector* vec, + const FT_Matrix* matrix ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* version */ + /* */ + /* <Title> */ + /* FreeType Version */ + /* */ + /* <Abstract> */ + /* Functions and macros related to FreeType versions. */ + /* */ + /* <Description> */ + /* Note that those functions and macros are of limited use because */ + /* even a new release of FreeType with only documentation changes */ + /* increases the version number. */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @enum: + * FREETYPE_XXX + * + * @description: + * These three macros identify the FreeType source code version. + * Use @FT_Library_Version to access them at runtime. + * + * @values: + * FREETYPE_MAJOR :: The major version number. + * FREETYPE_MINOR :: The minor version number. + * FREETYPE_PATCH :: The patch level. + * + * @note: + * The version number of FreeType if built as a dynamic link library + * with the `libtool' package is _not_ controlled by these three + * macros. + */ +#define FREETYPE_MAJOR 2 +#define FREETYPE_MINOR 3 +#define FREETYPE_PATCH 5 + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Library_Version */ + /* */ + /* <Description> */ + /* Return the version of the FreeType library being used. This is */ + /* useful when dynamically linking to the library, since one cannot */ + /* use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and */ + /* @FREETYPE_PATCH. */ + /* */ + /* <Input> */ + /* library :: A source library handle. */ + /* */ + /* <Output> */ + /* amajor :: The major version number. */ + /* */ + /* aminor :: The minor version number. */ + /* */ + /* apatch :: The patch version number. */ + /* */ + /* <Note> */ + /* The reason why this function takes a `library' argument is because */ + /* certain programs implement library initialization in a custom way */ + /* that doesn't use @FT_Init_FreeType. */ + /* */ + /* In such cases, the library version might not be available before */ + /* the library object has been created. */ + /* */ + FT_EXPORT( void ) + FT_Library_Version( FT_Library library, + FT_Int *amajor, + FT_Int *aminor, + FT_Int *apatch ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_CheckTrueTypePatents */ + /* */ + /* <Description> */ + /* Parse all bytecode instructions of a TrueType font file to check */ + /* whether any of the patented opcodes are used. This is only useful */ + /* if you want to be able to use the unpatented hinter with */ + /* fonts that do *not* use these opcodes. */ + /* */ + /* Note that this function parses *all* glyph instructions in the */ + /* font file, which may be slow. */ + /* */ + /* <Input> */ + /* face :: A face handle. */ + /* */ + /* <Return> */ + /* 1 if this is a TrueType font that uses one of the patented */ + /* opcodes, 0 otherwise. */ + /* */ + /* <Since> */ + /* 2.3.5 */ + /* */ + FT_EXPORT( FT_Bool ) + FT_Face_CheckTrueTypePatents( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Face_SetUnpatentedHinting */ + /* */ + /* <Description> */ + /* Enable or disable the unpatented hinter for a given face. */ + /* Only enable it if you have determined that the face doesn't */ + /* use any patented opcodes (see @FT_Face_CheckTrueTypePatents). */ + /* */ + /* <Input> */ + /* face :: A face handle. */ + /* */ + /* value :: New boolean setting. */ + /* */ + /* <Return> */ + /* The old setting value. This will always be false if this is not */ + /* a SFNT font, or if the unpatented hinter is not compiled in this */ + /* instance of the library. */ + /* */ + /* <Since> */ + /* 2.3.5 */ + /* */ + FT_EXPORT( FT_Bool ) + FT_Face_SetUnpatentedHinting( FT_Face face, + FT_Bool value ); + + /* */ + + +FT_END_HEADER + +#endif /* __FREETYPE_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftbbox.h b/libIGraph/include/freetype/ftbbox.h new file mode 100644 index 0000000..5f79c32 --- /dev/null +++ b/libIGraph/include/freetype/ftbbox.h @@ -0,0 +1,94 @@ +/***************************************************************************/ +/* */ +/* ftbbox.h */ +/* */ +/* FreeType exact bbox computation (specification). */ +/* */ +/* Copyright 1996-2001, 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This component has a _single_ role: to compute exact outline bounding */ + /* boxes. */ + /* */ + /* It is separated from the rest of the engine for various technical */ + /* reasons. It may well be integrated in `ftoutln' later. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTBBOX_H__ +#define __FTBBOX_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* outline_processing */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Get_BBox */ + /* */ + /* <Description> */ + /* Computes the exact bounding box of an outline. This is slower */ + /* than computing the control box. However, it uses an advanced */ + /* algorithm which returns _very_ quickly when the two boxes */ + /* coincide. Otherwise, the outline Bézier arcs are walked over to */ + /* extract their extrema. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source outline. */ + /* */ + /* <Output> */ + /* abbox :: The outline's exact bounding box. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_BBox( FT_Outline* outline, + FT_BBox *abbox ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTBBOX_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/libIGraph/include/freetype/ftbdf.h b/libIGraph/include/freetype/ftbdf.h new file mode 100644 index 0000000..9555694 --- /dev/null +++ b/libIGraph/include/freetype/ftbdf.h @@ -0,0 +1,200 @@ +/***************************************************************************/ +/* */ +/* ftbdf.h */ +/* */ +/* FreeType API for accessing BDF-specific strings (specification). */ +/* */ +/* Copyright 2002, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTBDF_H__ +#define __FTBDF_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* bdf_fonts */ + /* */ + /* <Title> */ + /* BDF Files */ + /* */ + /* <Abstract> */ + /* BDF specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of BDF specific functions. */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @enum: + * FT_PropertyType + * + * @description: + * A list of BDF property types. + * + * @values: + * BDF_PROPERTY_TYPE_NONE :: + * Value 0 is used to indicate a missing property. + * + * BDF_PROPERTY_TYPE_ATOM :: + * Property is a string atom. + * + * BDF_PROPERTY_TYPE_INTEGER :: + * Property is a 32-bit signed integer. + * + * BDF_PROPERTY_TYPE_CARDINAL :: + * Property is a 32-bit unsigned integer. + */ + typedef enum BDF_PropertyType_ + { + BDF_PROPERTY_TYPE_NONE = 0, + BDF_PROPERTY_TYPE_ATOM = 1, + BDF_PROPERTY_TYPE_INTEGER = 2, + BDF_PROPERTY_TYPE_CARDINAL = 3 + + } BDF_PropertyType; + + + /********************************************************************** + * + * @type: + * BDF_Property + * + * @description: + * A handle to a @BDF_PropertyRec structure to model a given + * BDF/PCF property. + */ + typedef struct BDF_PropertyRec_* BDF_Property; + + + /********************************************************************** + * + * @struct: + * BDF_PropertyRec + * + * @description: + * This structure models a given BDF/PCF property. + * + * @fields: + * type :: + * The property type. + * + * u.atom :: + * The atom string, if type is @BDF_PROPERTY_TYPE_ATOM. + * + * u.integer :: + * A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER. + * + * u.cardinal :: + * An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL. + */ + typedef struct BDF_PropertyRec_ + { + BDF_PropertyType type; + union { + const char* atom; + FT_Int32 integer; + FT_UInt32 cardinal; + + } u; + + } BDF_PropertyRec; + + + /********************************************************************** + * + * @function: + * FT_Get_BDF_Charset_ID + * + * @description: + * Retrieves a BDF font character set identity, according to + * the BDF specification. + * + * @input: + * face :: + * A handle to the input face. + * + * @output: + * acharset_encoding :: + * Charset encoding, as a C string, owned by the face. + * + * acharset_registry :: + * Charset registry, as a C string, owned by the face. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function only works with BDF faces, returning an error otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Charset_ID( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + + /********************************************************************** + * + * @function: + * FT_Get_BDF_Property + * + * @description: + * Retrieves a BDF property from a BDF or PCF font file. + * + * @input: + * face :: A handle to the input face. + * + * name :: The property name. + * + * @output: + * aproperty :: The property. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function works with BDF _and_ PCF fonts. It returns an error + * otherwise. It also returns an error if the property is not in the + * font. + * + * In case of error, `aproperty->type' is always set to + * @BDF_PROPERTY_TYPE_NONE. + */ + FT_EXPORT( FT_Error ) + FT_Get_BDF_Property( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + /* */ + +FT_END_HEADER + +#endif /* __FTBDF_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftbitmap.h b/libIGraph/include/freetype/ftbitmap.h new file mode 100644 index 0000000..337d888 --- /dev/null +++ b/libIGraph/include/freetype/ftbitmap.h @@ -0,0 +1,206 @@ +/***************************************************************************/ +/* */ +/* ftbitmap.h */ +/* */ +/* FreeType utility functions for converting 1bpp, 2bpp, 4bpp, and 8bpp */ +/* bitmaps into 8bpp format (specification). */ +/* */ +/* Copyright 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTBITMAP_H__ +#define __FTBITMAP_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* bitmap_handling */ + /* */ + /* <Title> */ + /* Bitmap Handling */ + /* */ + /* <Abstract> */ + /* Handling FT_Bitmap objects. */ + /* */ + /* <Description> */ + /* This section contains functions for converting FT_Bitmap objects. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_New */ + /* */ + /* <Description> */ + /* Initialize a pointer to an @FT_Bitmap structure. */ + /* */ + /* <InOut> */ + /* abitmap :: A pointer to the bitmap structure. */ + /* */ + FT_EXPORT( void ) + FT_Bitmap_New( FT_Bitmap *abitmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Copy */ + /* */ + /* <Description> */ + /* Copies an bitmap into another one. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* source :: A handle to the source bitmap. */ + /* */ + /* <Output> */ + /* target :: A handle to the target bitmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Copy( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Embolden */ + /* */ + /* <Description> */ + /* Embolden a bitmap. The new bitmap will be about `xStrength' */ + /* pixels wider and `yStrength' pixels higher. The left and bottom */ + /* borders are kept unchanged. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* xStrength :: How strong the glyph is emboldened horizontally. */ + /* Expressed in 26.6 pixel format. */ + /* */ + /* yStrength :: How strong the glyph is emboldened vertically. */ + /* Expressed in 26.6 pixel format. */ + /* */ + /* <InOut> */ + /* bitmap :: A handle to the target bitmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The current implementation restricts `xStrength' to be less than */ + /* or equal to 8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO. */ + /* */ + /* If you want to embolden the bitmap owned by a @FT_GlyphSlotRec, */ + /* you should call `FT_GlyphSlot_Own_Bitmap' on the slot first. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Embolden( FT_Library library, + FT_Bitmap* bitmap, + FT_Pos xStrength, + FT_Pos yStrength ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Convert */ + /* */ + /* <Description> */ + /* Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, or 8bpp to a */ + /* bitmap object with depth 8bpp, making the number of used bytes per */ + /* line (a.k.a. the `pitch') a multiple of `alignment'. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* source :: The source bitmap. */ + /* */ + /* alignment :: The pitch of the bitmap is a multiple of this */ + /* parameter. Common values are 1, 2, or 4. */ + /* */ + /* <Output> */ + /* target :: The target bitmap. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* It is possible to call @FT_Bitmap_Convert multiple times without */ + /* calling @FT_Bitmap_Done (the memory is simply reallocated). */ + /* */ + /* Use @FT_Bitmap_Done to finally remove the bitmap object. */ + /* */ + /* The `library' argument is taken to have access to FreeType's */ + /* memory handling functions. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Convert( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Bitmap_Done */ + /* */ + /* <Description> */ + /* Destroy a bitmap object created with @FT_Bitmap_New. */ + /* */ + /* <Input> */ + /* library :: A handle to a library object. */ + /* */ + /* bitmap :: The bitmap object to be freed. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The `library' argument is taken to have access to FreeType's */ + /* memory handling functions. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Done( FT_Library library, + FT_Bitmap *bitmap ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTBITMAP_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftcache.h b/libIGraph/include/freetype/ftcache.h new file mode 100644 index 0000000..721aa16 --- /dev/null +++ b/libIGraph/include/freetype/ftcache.h @@ -0,0 +1,1110 @@ +/***************************************************************************/ +/* */ +/* ftcache.h */ +/* */ +/* FreeType Cache subsystem (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCACHE_H__ +#define __FTCACHE_H__ + + +#include <ft2build.h> +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************* + * + * <Section> + * cache_subsystem + * + * <Title> + * Cache Sub-System + * + * <Abstract> + * How to cache face, size, and glyph data with FreeType 2. + * + * <Description> + * This section describes the FreeType 2 cache sub-system, which is used + * to limit the number of concurrently opened @FT_Face and @FT_Size + * objects, as well as caching information like character maps and glyph + * images while limiting their maximum memory usage. + * + * Note that all types and functions begin with the `FTC_' prefix. + * + * The cache is highly portable and thus doesn't know anything about the + * fonts installed on your system, or how to access them. This implies + * the following scheme: + * + * First, available or installed font faces are uniquely identified by + * @FTC_FaceID values, provided to the cache by the client. Note that + * the cache only stores and compares these values, and doesn't try to + * interpret them in any way. + * + * Second, the cache calls, only when needed, a client-provided function + * to convert a @FTC_FaceID into a new @FT_Face object. The latter is + * then completely managed by the cache, including its termination + * through @FT_Done_Face. + * + * Clients are free to map face IDs to anything else. The most simple + * usage is to associate them to a (pathname,face_index) pair that is + * used to call @FT_New_Face. However, more complex schemes are also + * possible. + * + * Note that for the cache to work correctly, the face ID values must be + * *persistent*, which means that the contents they point to should not + * change at runtime, or that their value should not become invalid. + * + * If this is unavoidable (e.g., when a font is uninstalled at runtime), + * you should call @FTC_Manager_RemoveFaceID as soon as possible, to let + * the cache get rid of any references to the old @FTC_FaceID it may + * keep internally. Failure to do so will lead to incorrect behaviour + * or even crashes. + * + * To use the cache, start with calling @FTC_Manager_New to create a new + * @FTC_Manager object, which models a single cache instance. You can + * then look up @FT_Face and @FT_Size objects with + * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively. + * + * If you want to use the charmap caching, call @FTC_CMapCache_New, then + * later use @FTC_CMapCache_Lookup to perform the equivalent of + * @FT_Get_Char_Index, only much faster. + * + * If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then + * later use @FTC_ImageCache_Lookup to retrieve the corresponding + * @FT_Glyph objects from the cache. + * + * If you need lots of small bitmaps, it is much more memory efficient + * to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This + * returns @FTC_SBitRec structures, which are used to store small + * bitmaps directly. (A small bitmap is one whose metrics and + * dimensions all fit into 8-bit integers). + * + * We hope to also provide a kerning cache in the near future. + * + * + * <Order> + * FTC_Manager + * FTC_FaceID + * FTC_Face_Requester + * + * FTC_Manager_New + * FTC_Manager_Reset + * FTC_Manager_Done + * FTC_Manager_LookupFace + * FTC_Manager_LookupSize + * FTC_Manager_RemoveFaceID + * + * FTC_Node + * FTC_Node_Unref + * + * FTC_ImageCache + * FTC_ImageCache_New + * FTC_ImageCache_Lookup + * + * FTC_SBit + * FTC_SBitCache + * FTC_SBitCache_New + * FTC_SBitCache_Lookup + * + * FTC_CMapCache + * FTC_CMapCache_New + * FTC_CMapCache_Lookup + * + *************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BASIC TYPE DEFINITIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: FTC_FaceID + * + * @description: + * An opaque pointer type that is used to identity face objects. The + * contents of such objects is application-dependent. + * + * These pointers are typically used to point to a user-defined + * structure containing a font file path, and face index. + * + * @note: + * Never use NULL as a valid @FTC_FaceID. + * + * Face IDs are passed by the client to the cache manager, which calls, + * when needed, the @FTC_Face_Requester to translate them into new + * @FT_Face objects. + * + * If the content of a given face ID changes at runtime, or if the value + * becomes invalid (e.g., when uninstalling a font), you should + * immediately call @FTC_Manager_RemoveFaceID before any other cache + * function. + * + * Failure to do so will result in incorrect behaviour or even + * memory leaks and crashes. + */ + typedef struct FTC_FaceIDRec_* FTC_FaceID; + + + /************************************************************************ + * + * @functype: + * FTC_Face_Requester + * + * @description: + * A callback function provided by client applications. It is used by + * the cache manager to translate a given @FTC_FaceID into a new valid + * @FT_Face object, on demand. + * + * <Input> + * face_id :: + * The face ID to resolve. + * + * library :: + * A handle to a FreeType library object. + * + * req_data :: + * Application-provided request data (see note below). + * + * <Output> + * aface :: + * A new @FT_Face handle. + * + * <Return> + * FreeType error code. 0 means success. + * + * <Note> + * The third parameter `req_data' is the same as the one passed by the + * client when @FTC_Manager_New is called. + * + * The face requester should not perform funny things on the returned + * face object, like creating a new @FT_Size for it, or setting a + * transformation through @FT_Set_Transform! + */ + typedef FT_Error + (*FTC_Face_Requester)( FTC_FaceID face_id, + FT_Library library, + FT_Pointer request_data, + FT_Face* aface ); + + /* */ + +#define FT_POINTER_TO_ULONG( p ) ( (FT_ULong)(FT_Pointer)(p) ) + +#define FTC_FACE_ID_HASH( i ) \ + ((FT_UInt32)(( FT_POINTER_TO_ULONG( i ) >> 3 ) ^ \ + ( FT_POINTER_TO_ULONG( i ) << 7 ) ) ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CACHE MANAGER OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_Manager */ + /* */ + /* <Description> */ + /* This object corresponds to one instance of the cache-subsystem. */ + /* It is used to cache one or more @FT_Face objects, along with */ + /* corresponding @FT_Size objects. */ + /* */ + /* The manager intentionally limits the total number of opened */ + /* @FT_Face and @FT_Size objects to control memory usage. See the */ + /* `max_faces' and `max_sizes' parameters of @FTC_Manager_New. */ + /* */ + /* The manager is also used to cache `nodes' of various types while */ + /* limiting their total memory usage. */ + /* */ + /* All limitations are enforced by keeping lists of managed objects */ + /* in most-recently-used order, and flushing old nodes to make room */ + /* for new ones. */ + /* */ + typedef struct FTC_ManagerRec_* FTC_Manager; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_Node */ + /* */ + /* <Description> */ + /* An opaque handle to a cache node object. Each cache node is */ + /* reference-counted. A node with a count of 0 might be flushed */ + /* out of a full cache whenever a lookup request is performed. */ + /* */ + /* If you lookup nodes, you have the ability to `acquire' them, i.e., */ + /* to increment their reference count. This will prevent the node */ + /* from being flushed out of the cache until you explicitly `release' */ + /* it (see @FTC_Node_Unref). */ + /* */ + /* See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup. */ + /* */ + typedef struct FTC_NodeRec_* FTC_Node; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_New */ + /* */ + /* <Description> */ + /* Creates a new cache manager. */ + /* */ + /* <Input> */ + /* library :: The parent FreeType library handle to use. */ + /* */ + /* max_faces :: Maximum number of opened @FT_Face objects managed by */ + /* this cache instance. Use 0 for defaults. */ + /* */ + /* max_sizes :: Maximum number of opened @FT_Size objects managed by */ + /* this cache instance. Use 0 for defaults. */ + /* */ + /* max_bytes :: Maximum number of bytes to use for cached data nodes. */ + /* Use 0 for defaults. Note that this value does not */ + /* account for managed @FT_Face and @FT_Size objects. */ + /* */ + /* requester :: An application-provided callback used to translate */ + /* face IDs into real @FT_Face objects. */ + /* */ + /* req_data :: A generic pointer that is passed to the requester */ + /* each time it is called (see @FTC_Face_Requester). */ + /* */ + /* <Output> */ + /* amanager :: A handle to a new manager object. 0 in case of */ + /* failure. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Manager_New( FT_Library library, + FT_UInt max_faces, + FT_UInt max_sizes, + FT_ULong max_bytes, + FTC_Face_Requester requester, + FT_Pointer req_data, + FTC_Manager *amanager ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_Reset */ + /* */ + /* <Description> */ + /* Empties a given cache manager. This simply gets rid of all the */ + /* currently cached @FT_Face and @FT_Size objects within the manager. */ + /* */ + /* <InOut> */ + /* manager :: A handle to the manager. */ + /* */ + FT_EXPORT( void ) + FTC_Manager_Reset( FTC_Manager manager ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_Done */ + /* */ + /* <Description> */ + /* Destroys a given manager after emptying it. */ + /* */ + /* <Input> */ + /* manager :: A handle to the target cache manager object. */ + /* */ + FT_EXPORT( void ) + FTC_Manager_Done( FTC_Manager manager ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_LookupFace */ + /* */ + /* <Description> */ + /* Retrieves the @FT_Face object that corresponds to a given face ID */ + /* through a cache manager. */ + /* */ + /* <Input> */ + /* manager :: A handle to the cache manager. */ + /* */ + /* face_id :: The ID of the face object. */ + /* */ + /* <Output> */ + /* aface :: A handle to the face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The returned @FT_Face object is always owned by the manager. You */ + /* should never try to discard it yourself. */ + /* */ + /* The @FT_Face object doesn't necessarily have a current size object */ + /* (i.e., face->size can be 0). If you need a specific `font size', */ + /* use @FTC_Manager_LookupSize instead. */ + /* */ + /* Never change the face's transformation matrix (i.e., never call */ + /* the @FT_Set_Transform function) on a returned face! If you need */ + /* to transform glyphs, do it yourself after glyph loading. */ + /* */ + /* When you perform a lookup, out-of-memory errors are detected */ + /* _within_ the lookup and force incremental flushes of the cache */ + /* until enough memory is released for the lookup to succeed. */ + /* */ + /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */ + /* already been completely flushed, and still no memory was available */ + /* for the operation. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupFace( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FTC_ScalerRec */ + /* */ + /* <Description> */ + /* A structure used to describe a given character size in either */ + /* pixels or points to the cache manager. See */ + /* @FTC_Manager_LookupSize. */ + /* */ + /* <Fields> */ + /* face_id :: The source face ID. */ + /* */ + /* width :: The character width. */ + /* */ + /* height :: The character height. */ + /* */ + /* pixel :: A Boolean. If 1, the `width' and `height' fields are */ + /* interpreted as integer pixel character sizes. */ + /* Otherwise, they are expressed as 1/64th of points. */ + /* */ + /* x_res :: Only used when `pixel' is value 0 to indicate the */ + /* horizontal resolution in dpi. */ + /* */ + /* y_res :: Only used when `pixel' is value 0 to indicate the */ + /* vertical resolution in dpi. */ + /* */ + /* <Note> */ + /* This type is mainly used to retrieve @FT_Size objects through the */ + /* cache manager. */ + /* */ + typedef struct FTC_ScalerRec_ + { + FTC_FaceID face_id; + FT_UInt width; + FT_UInt height; + FT_Int pixel; + FT_UInt x_res; + FT_UInt y_res; + + } FTC_ScalerRec, *FTC_Scaler; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Manager_LookupSize */ + /* */ + /* <Description> */ + /* Retrieve the @FT_Size object that corresponds to a given */ + /* @FTC_ScalerRec pointer through a cache manager. */ + /* */ + /* <Input> */ + /* manager :: A handle to the cache manager. */ + /* */ + /* scaler :: A scaler handle. */ + /* */ + /* <Output> */ + /* asize :: A handle to the size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The returned @FT_Size object is always owned by the manager. You */ + /* should never try to discard it by yourself. */ + /* */ + /* You can access the parent @FT_Face object simply as `size->face' */ + /* if you need it. Note that this object is also owned by the */ + /* manager. */ + /* */ + /* <Note> */ + /* When you perform a lookup, out-of-memory errors are detected */ + /* _within_ the lookup and force incremental flushes of the cache */ + /* until enough memory is released for the lookup to succeed. */ + /* */ + /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */ + /* already been completely flushed, and still no memory is available */ + /* for the operation. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_Manager_LookupSize( FTC_Manager manager, + FTC_Scaler scaler, + FT_Size *asize ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_Node_Unref */ + /* */ + /* <Description> */ + /* Decrement a cache node's internal reference count. When the count */ + /* reaches 0, it is not destroyed but becomes eligible for subsequent */ + /* cache flushes. */ + /* */ + /* <Input> */ + /* node :: The cache node handle. */ + /* */ + /* manager :: The cache manager handle. */ + /* */ + FT_EXPORT( void ) + FTC_Node_Unref( FTC_Node node, + FTC_Manager manager ); + + + /************************************************************************* + * + * @function: + * FTC_Manager_RemoveFaceID + * + * @description: + * A special function used to indicate to the cache manager that + * a given @FTC_FaceID is no longer valid, either because its + * content changed, or because it was deallocated or uninstalled. + * + * @input: + * manager :: + * The cache manager handle. + * + * face_id :: + * The @FTC_FaceID to be removed. + * + * @note: + * This function flushes all nodes from the cache corresponding to this + * `face_id', with the exception of nodes with a non-null reference + * count. + * + * Such nodes are however modified internally so as to never appear + * in later lookups with the same `face_id' value, and to be immediately + * destroyed when released by all their users. + * + */ + FT_EXPORT( void ) + FTC_Manager_RemoveFaceID( FTC_Manager manager, + FTC_FaceID face_id ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + /************************************************************************* + * + * @type: + * FTC_CMapCache + * + * @description: + * An opaque handle used to model a charmap cache. This cache is to + * hold character codes -> glyph indices mappings. + * + */ + typedef struct FTC_CMapCacheRec_* FTC_CMapCache; + + + /************************************************************************* + * + * @function: + * FTC_CMapCache_New + * + * @description: + * Create a new charmap cache. + * + * @input: + * manager :: + * A handle to the cache manager. + * + * @output: + * acache :: + * A new cache handle. NULL in case of error. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * Like all other caches, this one will be destroyed with the cache + * manager. + * + */ + FT_EXPORT( FT_Error ) + FTC_CMapCache_New( FTC_Manager manager, + FTC_CMapCache *acache ); + + + /************************************************************************ + * + * @function: + * FTC_CMapCache_Lookup + * + * @description: + * Translate a character code into a glyph index, using the charmap + * cache. + * + * @input: + * cache :: + * A charmap cache handle. + * + * face_id :: + * The source face ID. + * + * cmap_index :: + * The index of the charmap in the source face. + * + * char_code :: + * The character code (in the corresponding charmap). + * + * @return: + * Glyph index. 0 means `no glyph'. + * + */ + FT_EXPORT( FT_UInt ) + FTC_CMapCache_Lookup( FTC_CMapCache cache, + FTC_FaceID face_id, + FT_Int cmap_index, + FT_UInt32 char_code ); + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* cache_subsystem */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** IMAGE CACHE OBJECT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /************************************************************************* + * + * @struct: + * FTC_ImageTypeRec + * + * @description: + * A structure used to model the type of images in a glyph cache. + * + * @fields: + * face_id :: + * The face ID. + * + * width :: + * The width in pixels. + * + * height :: + * The height in pixels. + * + * flags :: + * The load flags, as in @FT_Load_Glyph. + * + */ + typedef struct FTC_ImageTypeRec_ + { + FTC_FaceID face_id; + FT_Int width; + FT_Int height; + FT_Int32 flags; + + } FTC_ImageTypeRec; + + + /************************************************************************* + * + * @type: + * FTC_ImageType + * + * @description: + * A handle to an @FTC_ImageTypeRec structure. + * + */ + typedef struct FTC_ImageTypeRec_* FTC_ImageType; + + + /* */ + + +#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \ + ( (d1)->face_id == (d2)->face_id && \ + (d1)->width == (d2)->width && \ + (d1)->flags == (d2)->flags ) + +#define FTC_IMAGE_TYPE_HASH( d ) \ + (FT_UFast)( FTC_FACE_ID_HASH( (d)->face_id ) ^ \ + ( (d)->width << 8 ) ^ (d)->height ^ \ + ( (d)->flags << 4 ) ) + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_ImageCache */ + /* */ + /* <Description> */ + /* A handle to an glyph image cache object. They are designed to */ + /* hold many distinct glyph images while not exceeding a certain */ + /* memory threshold. */ + /* */ + typedef struct FTC_ImageCacheRec_* FTC_ImageCache; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_ImageCache_New */ + /* */ + /* <Description> */ + /* Creates a new glyph image cache. */ + /* */ + /* <Input> */ + /* manager :: The parent manager for the image cache. */ + /* */ + /* <Output> */ + /* acache :: A handle to the new glyph image cache object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_New( FTC_Manager manager, + FTC_ImageCache *acache ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_ImageCache_Lookup */ + /* */ + /* <Description> */ + /* Retrieves a given glyph image from a glyph image cache. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source glyph image cache. */ + /* */ + /* type :: A pointer to a glyph image type descriptor. */ + /* */ + /* gindex :: The glyph index to retrieve. */ + /* */ + /* <Output> */ + /* aglyph :: The corresponding @FT_Glyph object. 0 in case of */ + /* failure. */ + /* */ + /* anode :: Used to return the address of of the corresponding cache */ + /* node after incrementing its reference count (see note */ + /* below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The returned glyph is owned and managed by the glyph image cache. */ + /* Never try to transform or discard it manually! You can however */ + /* create a copy with @FT_Glyph_Copy and modify the new one. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the glyph image, after increasing its reference */ + /* count. This ensures that the node (as well as the @FT_Glyph) will */ + /* always be kept in the cache until you call @FTC_Node_Unref to */ + /* `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the @FT_Glyph could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_Lookup( FTC_ImageCache cache, + FTC_ImageType type, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_ImageCache_LookupScaler */ + /* */ + /* <Description> */ + /* A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec */ + /* to specify the face ID and its size. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source glyph image cache. */ + /* */ + /* scaler :: A pointer to a scaler descriptor. */ + /* */ + /* load_flags :: The corresponding load flags. */ + /* */ + /* gindex :: The glyph index to retrieve. */ + /* */ + /* <Output> */ + /* aglyph :: The corresponding @FT_Glyph object. 0 in case of */ + /* failure. */ + /* */ + /* anode :: Used to return the address of of the corresponding */ + /* cache node after incrementing its reference count */ + /* (see note below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The returned glyph is owned and managed by the glyph image cache. */ + /* Never try to transform or discard it manually! You can however */ + /* create a copy with @FT_Glyph_Copy and modify the new one. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the glyph image, after increasing its reference */ + /* count. This ensures that the node (as well as the @FT_Glyph) will */ + /* always be kept in the cache until you call @FTC_Node_Unref to */ + /* `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the @FT_Glyph could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_ImageCache_LookupScaler( FTC_ImageCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FT_Glyph *aglyph, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_SBit */ + /* */ + /* <Description> */ + /* A handle to a small bitmap descriptor. See the @FTC_SBitRec */ + /* structure for details. */ + /* */ + typedef struct FTC_SBitRec_* FTC_SBit; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FTC_SBitRec */ + /* */ + /* <Description> */ + /* A very compact structure used to describe a small glyph bitmap. */ + /* */ + /* <Fields> */ + /* width :: The bitmap width in pixels. */ + /* */ + /* height :: The bitmap height in pixels. */ + /* */ + /* left :: The horizontal distance from the pen position to the */ + /* left bitmap border (a.k.a. `left side bearing', or */ + /* `lsb'). */ + /* */ + /* top :: The vertical distance from the pen position (on the */ + /* baseline) to the upper bitmap border (a.k.a. `top */ + /* side bearing'). The distance is positive for upwards */ + /* Y coordinates. */ + /* */ + /* format :: The format of the glyph bitmap (monochrome or gray). */ + /* */ + /* max_grays :: Maximum gray level value (in the range 1 to 255). */ + /* */ + /* pitch :: The number of bytes per bitmap line. May be positive */ + /* or negative. */ + /* */ + /* xadvance :: The horizontal advance width in pixels. */ + /* */ + /* yadvance :: The vertical advance height in pixels. */ + /* */ + /* buffer :: A pointer to the bitmap pixels. */ + /* */ + typedef struct FTC_SBitRec_ + { + FT_Byte width; + FT_Byte height; + FT_Char left; + FT_Char top; + + FT_Byte format; + FT_Byte max_grays; + FT_Short pitch; + FT_Char xadvance; + FT_Char yadvance; + + FT_Byte* buffer; + + } FTC_SBitRec; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FTC_SBitCache */ + /* */ + /* <Description> */ + /* A handle to a small bitmap cache. These are special cache objects */ + /* used to store small glyph bitmaps (and anti-aliased pixmaps) in a */ + /* much more efficient way than the traditional glyph image cache */ + /* implemented by @FTC_ImageCache. */ + /* */ + typedef struct FTC_SBitCacheRec_* FTC_SBitCache; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_SBitCache_New */ + /* */ + /* <Description> */ + /* Creates a new cache to store small glyph bitmaps. */ + /* */ + /* <Input> */ + /* manager :: A handle to the source cache manager. */ + /* */ + /* <Output> */ + /* acache :: A handle to the new sbit cache. NULL in case of error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_New( FTC_Manager manager, + FTC_SBitCache *acache ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_SBitCache_Lookup */ + /* */ + /* <Description> */ + /* Looks up a given small glyph bitmap in a given sbit cache and */ + /* `lock' it to prevent its flushing from the cache until needed. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source sbit cache. */ + /* */ + /* type :: A pointer to the glyph image type descriptor. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* <Output> */ + /* sbit :: A handle to a small bitmap descriptor. */ + /* */ + /* anode :: Used to return the address of of the corresponding cache */ + /* node after incrementing its reference count (see note */ + /* below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The small bitmap descriptor and its bit buffer are owned by the */ + /* cache and should never be freed by the application. They might */ + /* as well disappear from memory on the next cache lookup, so don't */ + /* treat them as persistent data. */ + /* */ + /* The descriptor's `buffer' field is set to 0 to indicate a missing */ + /* glyph bitmap. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the bitmap, after increasing its reference count. */ + /* This ensures that the node (as well as the image) will always be */ + /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the bitmap could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_Lookup( FTC_SBitCache cache, + FTC_ImageType type, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FTC_SBitCache_LookupScaler */ + /* */ + /* <Description> */ + /* A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec */ + /* to specify the face ID and its size. */ + /* */ + /* <Input> */ + /* cache :: A handle to the source sbit cache. */ + /* */ + /* scaler :: A pointer to the scaler descriptor. */ + /* */ + /* load_flags :: The corresponding load flags. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* <Output> */ + /* sbit :: A handle to a small bitmap descriptor. */ + /* */ + /* anode :: Used to return the address of of the corresponding */ + /* cache node after incrementing its reference count */ + /* (see note below). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The small bitmap descriptor and its bit buffer are owned by the */ + /* cache and should never be freed by the application. They might */ + /* as well disappear from memory on the next cache lookup, so don't */ + /* treat them as persistent data. */ + /* */ + /* The descriptor's `buffer' field is set to 0 to indicate a missing */ + /* glyph bitmap. */ + /* */ + /* If `anode' is _not_ NULL, it receives the address of the cache */ + /* node containing the bitmap, after increasing its reference count. */ + /* This ensures that the node (as well as the image) will always be */ + /* kept in the cache until you call @FTC_Node_Unref to `release' it. */ + /* */ + /* If `anode' is NULL, the cache node is left unchanged, which means */ + /* that the bitmap could be flushed out of the cache on the next */ + /* call to one of the caching sub-system APIs. Don't assume that it */ + /* is persistent! */ + /* */ + FT_EXPORT( FT_Error ) + FTC_SBitCache_LookupScaler( FTC_SBitCache cache, + FTC_Scaler scaler, + FT_ULong load_flags, + FT_UInt gindex, + FTC_SBit *sbit, + FTC_Node *anode ); + + + /* */ + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*@***********************************************************************/ + /* */ + /* <Struct> */ + /* FTC_FontRec */ + /* */ + /* <Description> */ + /* A simple structure used to describe a given `font' to the cache */ + /* manager. Note that a `font' is the combination of a given face */ + /* with a given character size. */ + /* */ + /* <Fields> */ + /* face_id :: The ID of the face to use. */ + /* */ + /* pix_width :: The character width in integer pixels. */ + /* */ + /* pix_height :: The character height in integer pixels. */ + /* */ + typedef struct FTC_FontRec_ + { + FTC_FaceID face_id; + FT_UShort pix_width; + FT_UShort pix_height; + + } FTC_FontRec; + + + /* */ + + +#define FTC_FONT_COMPARE( f1, f2 ) \ + ( (f1)->face_id == (f2)->face_id && \ + (f1)->pix_width == (f2)->pix_width && \ + (f1)->pix_height == (f2)->pix_height ) + +#define FTC_FONT_HASH( f ) \ + (FT_UInt32)( FTC_FACE_ID_HASH((f)->face_id) ^ \ + ((f)->pix_width << 8) ^ \ + ((f)->pix_height) ) + + typedef FTC_FontRec* FTC_Font; + + + FT_EXPORT( FT_Error ) + FTC_Manager_Lookup_Face( FTC_Manager manager, + FTC_FaceID face_id, + FT_Face *aface ); + + FT_EXPORT( FT_Error ) + FTC_Manager_Lookup_Size( FTC_Manager manager, + FTC_Font font, + FT_Face *aface, + FT_Size *asize ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /* */ + +FT_END_HEADER + +#endif /* __FTCACHE_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftchapters.h b/libIGraph/include/freetype/ftchapters.h new file mode 100644 index 0000000..bd812c8 --- /dev/null +++ b/libIGraph/include/freetype/ftchapters.h @@ -0,0 +1,100 @@ +/***************************************************************************/ +/* */ +/* This file defines the structure of the FreeType reference. */ +/* It is used by the python script which generates the HTML files. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* general_remarks */ +/* */ +/* <Title> */ +/* General Remarks */ +/* */ +/* <Sections> */ +/* user_allocation */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* core_api */ +/* */ +/* <Title> */ +/* Core API */ +/* */ +/* <Sections> */ +/* version */ +/* basic_types */ +/* base_interface */ +/* glyph_management */ +/* mac_specific */ +/* sizes_management */ +/* header_file_macros */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* format_specific */ +/* */ +/* <Title> */ +/* Format-Specific API */ +/* */ +/* <Sections> */ +/* multiple_masters */ +/* truetype_tables */ +/* type1_tables */ +/* sfnt_names */ +/* bdf_fonts */ +/* pfr_fonts */ +/* winfnt_fonts */ +/* font_formats */ +/* gasp_table */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* cache_subsystem */ +/* */ +/* <Title> */ +/* Cache Sub-System */ +/* */ +/* <Sections> */ +/* cache_subsystem */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* <Chapter> */ +/* support_api */ +/* */ +/* <Title> */ +/* Support API */ +/* */ +/* <Sections> */ +/* computations */ +/* list_processing */ +/* outline_processing */ +/* bitmap_handling */ +/* raster */ +/* glyph_stroker */ +/* system_interface */ +/* module_management */ +/* gzip */ +/* lzw */ +/* lcd_filtering */ +/* */ +/***************************************************************************/ diff --git a/libIGraph/include/freetype/fterrdef.h b/libIGraph/include/freetype/fterrdef.h new file mode 100644 index 0000000..d7ad256 --- /dev/null +++ b/libIGraph/include/freetype/fterrdef.h @@ -0,0 +1,239 @@ +/***************************************************************************/ +/* */ +/* fterrdef.h */ +/* */ +/* FreeType error codes (specification). */ +/* */ +/* Copyright 2002, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** LIST OF ERROR CODES/MESSAGES *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + + /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */ + /* including this file. */ + + + /* generic errors */ + + FT_NOERRORDEF_( Ok, 0x00, \ + "no error" ) + + FT_ERRORDEF_( Cannot_Open_Resource, 0x01, \ + "cannot open resource" ) + FT_ERRORDEF_( Unknown_File_Format, 0x02, \ + "unknown file format" ) + FT_ERRORDEF_( Invalid_File_Format, 0x03, \ + "broken file" ) + FT_ERRORDEF_( Invalid_Version, 0x04, \ + "invalid FreeType version" ) + FT_ERRORDEF_( Lower_Module_Version, 0x05, \ + "module version is too low" ) + FT_ERRORDEF_( Invalid_Argument, 0x06, \ + "invalid argument" ) + FT_ERRORDEF_( Unimplemented_Feature, 0x07, \ + "unimplemented feature" ) + FT_ERRORDEF_( Invalid_Table, 0x08, \ + "broken table" ) + FT_ERRORDEF_( Invalid_Offset, 0x09, \ + "broken offset within table" ) + FT_ERRORDEF_( Array_Too_Large, 0x0A, \ + "array allocation size too large" ) + + /* glyph/character errors */ + + FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, \ + "invalid glyph index" ) + FT_ERRORDEF_( Invalid_Character_Code, 0x11, \ + "invalid character code" ) + FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, \ + "unsupported glyph image format" ) + FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, \ + "cannot render this glyph format" ) + FT_ERRORDEF_( Invalid_Outline, 0x14, \ + "invalid outline" ) + FT_ERRORDEF_( Invalid_Composite, 0x15, \ + "invalid composite glyph" ) + FT_ERRORDEF_( Too_Many_Hints, 0x16, \ + "too many hints" ) + FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, \ + "invalid pixel size" ) + + /* handle errors */ + + FT_ERRORDEF_( Invalid_Handle, 0x20, \ + "invalid object handle" ) + FT_ERRORDEF_( Invalid_Library_Handle, 0x21, \ + "invalid library handle" ) + FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, \ + "invalid module handle" ) + FT_ERRORDEF_( Invalid_Face_Handle, 0x23, \ + "invalid face handle" ) + FT_ERRORDEF_( Invalid_Size_Handle, 0x24, \ + "invalid size handle" ) + FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, \ + "invalid glyph slot handle" ) + FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, \ + "invalid charmap handle" ) + FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, \ + "invalid cache manager handle" ) + FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, \ + "invalid stream handle" ) + + /* driver errors */ + + FT_ERRORDEF_( Too_Many_Drivers, 0x30, \ + "too many modules" ) + FT_ERRORDEF_( Too_Many_Extensions, 0x31, \ + "too many extensions" ) + + /* memory errors */ + + FT_ERRORDEF_( Out_Of_Memory, 0x40, \ + "out of memory" ) + FT_ERRORDEF_( Unlisted_Object, 0x41, \ + "unlisted object" ) + + /* stream errors */ + + FT_ERRORDEF_( Cannot_Open_Stream, 0x51, \ + "cannot open stream" ) + FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, \ + "invalid stream seek" ) + FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, \ + "invalid stream skip" ) + FT_ERRORDEF_( Invalid_Stream_Read, 0x54, \ + "invalid stream read" ) + FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, \ + "invalid stream operation" ) + FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, \ + "invalid frame operation" ) + FT_ERRORDEF_( Nested_Frame_Access, 0x57, \ + "nested frame access" ) + FT_ERRORDEF_( Invalid_Frame_Read, 0x58, \ + "invalid frame read" ) + + /* raster errors */ + + FT_ERRORDEF_( Raster_Uninitialized, 0x60, \ + "raster uninitialized" ) + FT_ERRORDEF_( Raster_Corrupted, 0x61, \ + "raster corrupted" ) + FT_ERRORDEF_( Raster_Overflow, 0x62, \ + "raster overflow" ) + FT_ERRORDEF_( Raster_Negative_Height, 0x63, \ + "negative height while rastering" ) + + /* cache errors */ + + FT_ERRORDEF_( Too_Many_Caches, 0x70, \ + "too many registered caches" ) + + /* TrueType and SFNT errors */ + + FT_ERRORDEF_( Invalid_Opcode, 0x80, \ + "invalid opcode" ) + FT_ERRORDEF_( Too_Few_Arguments, 0x81, \ + "too few arguments" ) + FT_ERRORDEF_( Stack_Overflow, 0x82, \ + "stack overflow" ) + FT_ERRORDEF_( Code_Overflow, 0x83, \ + "code overflow" ) + FT_ERRORDEF_( Bad_Argument, 0x84, \ + "bad argument" ) + FT_ERRORDEF_( Divide_By_Zero, 0x85, \ + "division by zero" ) + FT_ERRORDEF_( Invalid_Reference, 0x86, \ + "invalid reference" ) + FT_ERRORDEF_( Debug_OpCode, 0x87, \ + "found debug opcode" ) + FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, \ + "found ENDF opcode in execution stream" ) + FT_ERRORDEF_( Nested_DEFS, 0x89, \ + "nested DEFS" ) + FT_ERRORDEF_( Invalid_CodeRange, 0x8A, \ + "invalid code range" ) + FT_ERRORDEF_( Execution_Too_Long, 0x8B, \ + "execution context too long" ) + FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, \ + "too many function definitions" ) + FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, \ + "too many instruction definitions" ) + FT_ERRORDEF_( Table_Missing, 0x8E, \ + "SFNT font table missing" ) + FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, \ + "horizontal header (hhea) table missing" ) + FT_ERRORDEF_( Locations_Missing, 0x90, \ + "locations (loca) table missing" ) + FT_ERRORDEF_( Name_Table_Missing, 0x91, \ + "name table missing" ) + FT_ERRORDEF_( CMap_Table_Missing, 0x92, \ + "character map (cmap) table missing" ) + FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, \ + "horizontal metrics (hmtx) table missing" ) + FT_ERRORDEF_( Post_Table_Missing, 0x94, \ + "PostScript (post) table missing" ) + FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, \ + "invalid horizontal metrics" ) + FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, \ + "invalid character map (cmap) format" ) + FT_ERRORDEF_( Invalid_PPem, 0x97, \ + "invalid ppem value" ) + FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, \ + "invalid vertical metrics" ) + FT_ERRORDEF_( Could_Not_Find_Context, 0x99, \ + "could not find context" ) + FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, \ + "invalid PostScript (post) table format" ) + FT_ERRORDEF_( Invalid_Post_Table, 0x9B, \ + "invalid PostScript (post) table" ) + + /* CFF, CID, and Type 1 errors */ + + FT_ERRORDEF_( Syntax_Error, 0xA0, \ + "opcode syntax error" ) + FT_ERRORDEF_( Stack_Underflow, 0xA1, \ + "argument stack underflow" ) + FT_ERRORDEF_( Ignore, 0xA2, \ + "ignore" ) + + /* BDF errors */ + + FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, \ + "`STARTFONT' field missing" ) + FT_ERRORDEF_( Missing_Font_Field, 0xB1, \ + "`FONT' field missing" ) + FT_ERRORDEF_( Missing_Size_Field, 0xB2, \ + "`SIZE' field missing" ) + FT_ERRORDEF_( Missing_Chars_Field, 0xB3, \ + "`CHARS' field missing" ) + FT_ERRORDEF_( Missing_Startchar_Field, 0xB4, \ + "`STARTCHAR' field missing" ) + FT_ERRORDEF_( Missing_Encoding_Field, 0xB5, \ + "`ENCODING' field missing" ) + FT_ERRORDEF_( Missing_Bbx_Field, 0xB6, \ + "`BBX' field missing" ) + FT_ERRORDEF_( Bbx_Too_Big, 0xB7, \ + "`BBX' too big" ) + FT_ERRORDEF_( Corrupted_Font_Header, 0xB8, \ + "Font header corrupted or missing fields" ) + FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xB9, \ + "Font glyphs corrupted or missing fields" ) + + +/* END */ diff --git a/libIGraph/include/freetype/fterrors.h b/libIGraph/include/freetype/fterrors.h new file mode 100644 index 0000000..6600dad --- /dev/null +++ b/libIGraph/include/freetype/fterrors.h @@ -0,0 +1,206 @@ +/***************************************************************************/ +/* */ +/* fterrors.h */ +/* */ +/* FreeType error code handling (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This special header file is used to define the handling of FT2 */ + /* enumeration constants. It can also be used to generate error message */ + /* strings with a small macro trick explained below. */ + /* */ + /* I - Error Formats */ + /* ----------------- */ + /* */ + /* The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be */ + /* defined in ftoption.h in order to make the higher byte indicate */ + /* the module where the error has happened (this is not compatible */ + /* with standard builds of FreeType 2). You can then use the macro */ + /* FT_ERROR_BASE macro to extract the generic error code from an */ + /* FT_Error value. */ + /* */ + /* */ + /* II - Error Message strings */ + /* -------------------------- */ + /* */ + /* The error definitions below are made through special macros that */ + /* allow client applications to build a table of error message strings */ + /* if they need it. The strings are not included in a normal build of */ + /* FreeType 2 to save space (most client applications do not use */ + /* them). */ + /* */ + /* To do so, you have to define the following macros before including */ + /* this file: */ + /* */ + /* FT_ERROR_START_LIST :: */ + /* This macro is called before anything else to define the start of */ + /* the error list. It is followed by several FT_ERROR_DEF calls */ + /* (see below). */ + /* */ + /* FT_ERROR_DEF( e, v, s ) :: */ + /* This macro is called to define one single error. */ + /* `e' is the error code identifier (e.g. FT_Err_Invalid_Argument). */ + /* `v' is the error numerical value. */ + /* `s' is the corresponding error string. */ + /* */ + /* FT_ERROR_END_LIST :: */ + /* This macro ends the list. */ + /* */ + /* Additionally, you have to undefine __FTERRORS_H__ before #including */ + /* this file. */ + /* */ + /* Here is a simple example: */ + /* */ + /* { */ + /* #undef __FTERRORS_H__ */ + /* #define FT_ERRORDEF( e, v, s ) { e, s }, */ + /* #define FT_ERROR_START_LIST { */ + /* #define FT_ERROR_END_LIST { 0, 0 } }; */ + /* */ + /* const struct */ + /* { */ + /* int err_code; */ + /* const char* err_msg; */ + /* } ft_errors[] = */ + /* */ + /* #include FT_ERRORS_H */ + /* } */ + /* */ + /*************************************************************************/ + + +#ifndef __FTERRORS_H__ +#define __FTERRORS_H__ + + + /* include module base error codes */ +#include FT_MODULE_ERRORS_H + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + +#undef FT_ERR_XCAT +#undef FT_ERR_CAT + +#define FT_ERR_XCAT( x, y ) x ## y +#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) + + + /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ + /* By default, we use `FT_Err_'. */ + /* */ +#ifndef FT_ERR_PREFIX +#define FT_ERR_PREFIX FT_Err_ +#endif + + + /* FT_ERR_BASE is used as the base for module-specific errors. */ + /* */ +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS + +#ifndef FT_ERR_BASE +#define FT_ERR_BASE FT_Mod_Err_Base +#endif + +#else + +#undef FT_ERR_BASE +#define FT_ERR_BASE 0 + +#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ + + + /* If FT_ERRORDEF is not defined, we need to define a simple */ + /* enumeration type. */ + /* */ +#ifndef FT_ERRORDEF + +#define FT_ERRORDEF( e, v, s ) e = v, +#define FT_ERROR_START_LIST enum { +#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_ERRORDEF */ + + + /* this macro is used to define an error */ +#define FT_ERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) + + /* this is only used for <module>_Err_Ok, which must be 0! */ +#define FT_NOERRORDEF_( e, v, s ) \ + FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) + + +#ifdef FT_ERROR_START_LIST + FT_ERROR_START_LIST +#endif + + + /* now include the error codes */ +#include FT_ERROR_DEFINITIONS_H + + +#ifdef FT_ERROR_END_LIST + FT_ERROR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SIMPLE CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_ERROR_START_LIST +#undef FT_ERROR_END_LIST + +#undef FT_ERRORDEF +#undef FT_ERRORDEF_ +#undef FT_NOERRORDEF_ + +#undef FT_NEED_EXTERN_C +#undef FT_ERR_CONCAT +#undef FT_ERR_BASE + + /* FT_KEEP_ERR_PREFIX is needed for ftvalid.h */ +#ifndef FT_KEEP_ERR_PREFIX +#undef FT_ERR_PREFIX +#endif + +#endif /* __FTERRORS_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftgasp.h b/libIGraph/include/freetype/ftgasp.h new file mode 100644 index 0000000..97cd330 --- /dev/null +++ b/libIGraph/include/freetype/ftgasp.h @@ -0,0 +1,113 @@ +/***************************************************************************/ +/* */ +/* ftgasp.h */ +/* */ +/* Access of TrueType's `gasp' table (specification). */ +/* */ +/* Copyright 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef _FT_GASP_H_ +#define _FT_GASP_H_ + +#include <ft2build.h> +#include FT_FREETYPE_H + + /*************************************************************************** + * + * @section: + * gasp_table + * + * @title: + * Gasp Table + * + * @abstract: + * Retrieving TrueType `gasp' table entries + * + * @description: + * The function @FT_Get_Gasp can be used to query a TrueType or OpenType + * font for specific entries in their `gasp' table, if any. This is + * mainly useful when implementing native TrueType hinting with the + * bytecode interpreter to duplicate the Windows text rendering results. + */ + + /************************************************************************* + * + * @enum: + * FT_GASP_XXX + * + * @description: + * A list of values and/or bit-flags returned by the @FT_Get_Gasp + * function. + * + * @values: + * FT_GASP_NO_TABLE :: + * This special value means that there is no GASP table in this face. + * It is up to the client to decide what to do. + * + * FT_GASP_DO_GRIDFIT :: + * Grid-fitting and hinting should be performed at the specified ppem. + * This *really* means TrueType bytecode interpretation. + * + * FT_GASP_DO_GRAY :: + * Anti-aliased rendering should be performed at the specified ppem. + * + * FT_GASP_SYMMETRIC_SMOOTHING :: + * Smoothing along multiple axes must be used with ClearType. + * + * FT_GASP_SYMMETRIC_GRIDFIT :: + * Grid-fitting must be used with ClearType's symmetric smoothing. + * + * @note: + * `ClearType' is Microsoft's implementation of LCD rendering, partly + * protected by patents. + * + * @since: + * 2.3.0 + */ +#define FT_GASP_NO_TABLE -1 +#define FT_GASP_DO_GRIDFIT 0x01 +#define FT_GASP_DO_GRAY 0x02 +#define FT_GASP_SYMMETRIC_SMOOTHING 0x08 +#define FT_GASP_SYMMETRIC_GRIDFIT 0x10 + + + /************************************************************************* + * + * @func: + * FT_Get_Gasp + * + * @description: + * Read the `gasp' table from a TrueType or OpenType font file and + * return the entry corresponding to a given character pixel size. + * + * @input: + * face :: The source face handle. + * ppem :: The vertical character pixel size. + * + * @return: + * Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE is there is no + * `gasp' table in the face. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Int ) + FT_Get_Gasp( FT_Face face, + FT_UInt ppem ); + +/* */ + +#endif /* _FT_GASP_H_ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftglyph.h b/libIGraph/include/freetype/ftglyph.h new file mode 100644 index 0000000..08058da --- /dev/null +++ b/libIGraph/include/freetype/ftglyph.h @@ -0,0 +1,575 @@ +/***************************************************************************/ +/* */ +/* ftglyph.h */ +/* */ +/* FreeType convenience functions to handle glyphs (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file contains the definition of several convenience functions */ + /* that can be used by client applications to easily retrieve glyph */ + /* bitmaps and outlines from a given face. */ + /* */ + /* These functions should be optional if you are writing a font server */ + /* or text layout engine on top of FreeType. However, they are pretty */ + /* handy for many other simple uses of the library. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTGLYPH_H__ +#define __FTGLYPH_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* glyph_management */ + /* */ + /* <Title> */ + /* Glyph Management */ + /* */ + /* <Abstract> */ + /* Generic interface to manage individual glyph data. */ + /* */ + /* <Description> */ + /* This section contains definitions used to manage glyph data */ + /* through generic FT_Glyph objects. Each of them can contain a */ + /* bitmap, a vector outline, or even images in other formats. */ + /* */ + /*************************************************************************/ + + + /* forward declaration to a private type */ + typedef struct FT_Glyph_Class_ FT_Glyph_Class; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Glyph */ + /* */ + /* <Description> */ + /* Handle to an object used to model generic glyph images. It is a */ + /* pointer to the @FT_GlyphRec structure and can contain a glyph */ + /* bitmap or pointer. */ + /* */ + /* <Note> */ + /* Glyph objects are not owned by the library. You must thus release */ + /* them manually (through @FT_Done_Glyph) _before_ calling */ + /* @FT_Done_FreeType. */ + /* */ + typedef struct FT_GlyphRec_* FT_Glyph; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_GlyphRec */ + /* */ + /* <Description> */ + /* The root glyph structure contains a given glyph image plus its */ + /* advance width in 16.16 fixed float format. */ + /* */ + /* <Fields> */ + /* library :: A handle to the FreeType library object. */ + /* */ + /* clazz :: A pointer to the glyph's class. Private. */ + /* */ + /* format :: The format of the glyph's image. */ + /* */ + /* advance :: A 16.16 vector that gives the glyph's advance width. */ + /* */ + typedef struct FT_GlyphRec_ + { + FT_Library library; + const FT_Glyph_Class* clazz; + FT_Glyph_Format format; + FT_Vector advance; + + } FT_GlyphRec; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_BitmapGlyph */ + /* */ + /* <Description> */ + /* A handle to an object used to model a bitmap glyph image. This is */ + /* a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. */ + /* */ + typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_BitmapGlyphRec */ + /* */ + /* <Description> */ + /* A structure used for bitmap glyph images. This really is a */ + /* `sub-class' of @FT_GlyphRec. */ + /* */ + /* <Fields> */ + /* root :: The root @FT_Glyph fields. */ + /* */ + /* left :: The left-side bearing, i.e., the horizontal distance */ + /* from the current pen position to the left border of the */ + /* glyph bitmap. */ + /* */ + /* top :: The top-side bearing, i.e., the vertical distance from */ + /* the current pen position to the top border of the glyph */ + /* bitmap. This distance is positive for upwards-y! */ + /* */ + /* bitmap :: A descriptor for the bitmap. */ + /* */ + /* <Note> */ + /* You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have */ + /* `glyph->format == FT_GLYPH_FORMAT_BITMAP'. This lets you access */ + /* the bitmap's contents easily. */ + /* */ + /* The corresponding pixel buffer is always owned by @FT_BitmapGlyph */ + /* and is thus created and destroyed with it. */ + /* */ + typedef struct FT_BitmapGlyphRec_ + { + FT_GlyphRec root; + FT_Int left; + FT_Int top; + FT_Bitmap bitmap; + + } FT_BitmapGlyphRec; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_OutlineGlyph */ + /* */ + /* <Description> */ + /* A handle to an object used to model an outline glyph image. This */ + /* is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */ + /* */ + typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_OutlineGlyphRec */ + /* */ + /* <Description> */ + /* A structure used for outline (vectorial) glyph images. This */ + /* really is a `sub-class' of @FT_GlyphRec. */ + /* */ + /* <Fields> */ + /* root :: The root @FT_Glyph fields. */ + /* */ + /* outline :: A descriptor for the outline. */ + /* */ + /* <Note> */ + /* You can typecast a @FT_Glyph to @FT_OutlineGlyph if you have */ + /* `glyph->format == FT_GLYPH_FORMAT_OUTLINE'. This lets you access */ + /* the outline's content easily. */ + /* */ + /* As the outline is extracted from a glyph slot, its coordinates are */ + /* expressed normally in 26.6 pixels, unless the flag */ + /* @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */ + /* */ + /* The outline's tables are always owned by the object and are */ + /* destroyed with it. */ + /* */ + typedef struct FT_OutlineGlyphRec_ + { + FT_GlyphRec root; + FT_Outline outline; + + } FT_OutlineGlyphRec; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Glyph */ + /* */ + /* <Description> */ + /* A function used to extract a glyph image from a slot. */ + /* */ + /* <Input> */ + /* slot :: A handle to the source glyph slot. */ + /* */ + /* <Output> */ + /* aglyph :: A handle to the glyph object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Glyph( FT_GlyphSlot slot, + FT_Glyph *aglyph ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_Copy */ + /* */ + /* <Description> */ + /* A function used to copy a glyph image. Note that the created */ + /* @FT_Glyph object must be released with @FT_Done_Glyph. */ + /* */ + /* <Input> */ + /* source :: A handle to the source glyph object. */ + /* */ + /* <Output> */ + /* target :: A handle to the target glyph object. 0 in case of */ + /* error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_Transform */ + /* */ + /* <Description> */ + /* Transforms a glyph image if its format is scalable. */ + /* */ + /* <InOut> */ + /* glyph :: A handle to the target glyph object. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to a 2x2 matrix to apply. */ + /* */ + /* delta :: A pointer to a 2d vector to apply. Coordinates are */ + /* expressed in 1/64th of a pixel. */ + /* */ + /* <Return> */ + /* FreeType error code (if not 0, the glyph format is not scalable). */ + /* */ + /* <Note> */ + /* The 2x2 transformation matrix is also applied to the glyph's */ + /* advance vector. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Glyph_Transform( FT_Glyph glyph, + FT_Matrix* matrix, + FT_Vector* delta ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Glyph_BBox_Mode */ + /* */ + /* <Description> */ + /* The mode how the values of @FT_Glyph_Get_CBox are returned. */ + /* */ + /* <Values> */ + /* FT_GLYPH_BBOX_UNSCALED :: */ + /* Return unscaled font units. */ + /* */ + /* FT_GLYPH_BBOX_SUBPIXELS :: */ + /* Return unfitted 26.6 coordinates. */ + /* */ + /* FT_GLYPH_BBOX_GRIDFIT :: */ + /* Return grid-fitted 26.6 coordinates. */ + /* */ + /* FT_GLYPH_BBOX_TRUNCATE :: */ + /* Return coordinates in integer pixels. */ + /* */ + /* FT_GLYPH_BBOX_PIXELS :: */ + /* Return grid-fitted pixel coordinates. */ + /* */ + typedef enum FT_Glyph_BBox_Mode_ + { + FT_GLYPH_BBOX_UNSCALED = 0, + FT_GLYPH_BBOX_SUBPIXELS = 0, + FT_GLYPH_BBOX_GRIDFIT = 1, + FT_GLYPH_BBOX_TRUNCATE = 2, + FT_GLYPH_BBOX_PIXELS = 3 + + } FT_Glyph_BBox_Mode; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_glyph_bbox_xxx */ + /* */ + /* <Description> */ + /* These constants are deprecated. Use the corresponding */ + /* @FT_Glyph_BBox_Mode values instead. */ + /* */ + /* <Values> */ + /* ft_glyph_bbox_unscaled :: See @FT_GLYPH_BBOX_UNSCALED. */ + /* ft_glyph_bbox_subpixels :: See @FT_GLYPH_BBOX_SUBPIXELS. */ + /* ft_glyph_bbox_gridfit :: See @FT_GLYPH_BBOX_GRIDFIT. */ + /* ft_glyph_bbox_truncate :: See @FT_GLYPH_BBOX_TRUNCATE. */ + /* ft_glyph_bbox_pixels :: See @FT_GLYPH_BBOX_PIXELS. */ + /* */ +#define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED +#define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS +#define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT +#define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE +#define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_Get_CBox */ + /* */ + /* <Description> */ + /* Return a glyph's `control box'. The control box encloses all the */ + /* outline's points, including Bézier control points. Though it */ + /* coincides with the exact bounding box for most glyphs, it can be */ + /* slightly larger in some situations (like when rotating an outline */ + /* which contains Bézier outside arcs). */ + /* */ + /* Computing the control box is very fast, while getting the bounding */ + /* box can take much more time as it needs to walk over all segments */ + /* and arcs in the outline. To get the latter, you can use the */ + /* `ftbbox' component which is dedicated to this single task. */ + /* */ + /* <Input> */ + /* glyph :: A handle to the source glyph object. */ + /* */ + /* mode :: The mode which indicates how to interpret the returned */ + /* bounding box values. */ + /* */ + /* <Output> */ + /* acbox :: The glyph coordinate bounding box. Coordinates are */ + /* expressed in 1/64th of pixels if it is grid-fitted. */ + /* */ + /* <Note> */ + /* Coordinates are relative to the glyph origin, using the Y-upwards */ + /* convention. */ + /* */ + /* If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode' */ + /* must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font */ + /* units in 26.6 pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS */ + /* is another name for this constant. */ + /* */ + /* Note that the maximum coordinates are exclusive, which means that */ + /* one can compute the width and height of the glyph image (be it in */ + /* integer or 26.6 pixels) as: */ + /* */ + /* { */ + /* width = bbox.xMax - bbox.xMin; */ + /* height = bbox.yMax - bbox.yMin; */ + /* } */ + /* */ + /* Note also that for 26.6 coordinates, if `bbox_mode' is set to */ + /* @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, */ + /* which corresponds to: */ + /* */ + /* { */ + /* bbox.xMin = FLOOR(bbox.xMin); */ + /* bbox.yMin = FLOOR(bbox.yMin); */ + /* bbox.xMax = CEILING(bbox.xMax); */ + /* bbox.yMax = CEILING(bbox.yMax); */ + /* } */ + /* */ + /* To get the bbox in pixel coordinates, set `bbox_mode' to */ + /* @FT_GLYPH_BBOX_TRUNCATE. */ + /* */ + /* To get the bbox in grid-fitted pixel coordinates, set `bbox_mode' */ + /* to @FT_GLYPH_BBOX_PIXELS. */ + /* */ + FT_EXPORT( void ) + FT_Glyph_Get_CBox( FT_Glyph glyph, + FT_UInt bbox_mode, + FT_BBox *acbox ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Glyph_To_Bitmap */ + /* */ + /* <Description> */ + /* Converts a given glyph object to a bitmap glyph object. */ + /* */ + /* <InOut> */ + /* the_glyph :: A pointer to a handle to the target glyph. */ + /* */ + /* <Input> */ + /* render_mode :: An enumeration that describe how the data is */ + /* rendered. */ + /* */ + /* origin :: A pointer to a vector used to translate the glyph */ + /* image before rendering. Can be 0 (if no */ + /* translation). The origin is expressed in */ + /* 26.6 pixels. */ + /* */ + /* destroy :: A boolean that indicates that the original glyph */ + /* image should be destroyed by this function. It is */ + /* never destroyed in case of error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The glyph image is translated with the `origin' vector before */ + /* rendering. */ + /* */ + /* The first parameter is a pointer to an @FT_Glyph handle, that will */ + /* be replaced by this function. Typically, you would use (omitting */ + /* error handling): */ + /* */ + /* */ + /* { */ + /* FT_Glyph glyph; */ + /* FT_BitmapGlyph glyph_bitmap; */ + /* */ + /* */ + /* // load glyph */ + /* error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT ); */ + /* */ + /* // extract glyph image */ + /* error = FT_Get_Glyph( face->glyph, &glyph ); */ + /* */ + /* // convert to a bitmap (default render mode + destroy old) */ + /* if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) */ + /* { */ + /* error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_DEFAULT, */ + /* 0, 1 ); */ + /* if ( error ) // glyph unchanged */ + /* ... */ + /* } */ + /* */ + /* // access bitmap content by typecasting */ + /* glyph_bitmap = (FT_BitmapGlyph)glyph; */ + /* */ + /* // do funny stuff with it, like blitting/drawing */ + /* ... */ + /* */ + /* // discard glyph image (bitmap or not) */ + /* FT_Done_Glyph( glyph ); */ + /* } */ + /* */ + /* */ + /* This function does nothing if the glyph format isn't scalable. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, + FT_Render_Mode render_mode, + FT_Vector* origin, + FT_Bool destroy ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Glyph */ + /* */ + /* <Description> */ + /* Destroys a given glyph. */ + /* */ + /* <Input> */ + /* glyph :: A handle to the target glyph object. */ + /* */ + FT_EXPORT( void ) + FT_Done_Glyph( FT_Glyph glyph ); + + /* */ + + + /* other helpful functions */ + + /*************************************************************************/ + /* */ + /* <Section> */ + /* computations */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Matrix_Multiply */ + /* */ + /* <Description> */ + /* Performs the matrix operation `b = a*b'. */ + /* */ + /* <Input> */ + /* a :: A pointer to matrix `a'. */ + /* */ + /* <InOut> */ + /* b :: A pointer to matrix `b'. */ + /* */ + /* <Note> */ + /* The result is undefined if either `a' or `b' is zero. */ + /* */ + FT_EXPORT( void ) + FT_Matrix_Multiply( const FT_Matrix* a, + FT_Matrix* b ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Matrix_Invert */ + /* */ + /* <Description> */ + /* Inverts a 2x2 matrix. Returns an error if it can't be inverted. */ + /* */ + /* <InOut> */ + /* matrix :: A pointer to the target matrix. Remains untouched in */ + /* case of error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Matrix_Invert( FT_Matrix* matrix ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTGLYPH_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/libIGraph/include/freetype/ftgxval.h b/libIGraph/include/freetype/ftgxval.h new file mode 100644 index 0000000..c7ea861 --- /dev/null +++ b/libIGraph/include/freetype/ftgxval.h @@ -0,0 +1,358 @@ +/***************************************************************************/ +/* */ +/* ftgxval.h */ +/* */ +/* FreeType API for validating TrueTypeGX/AAT tables (specification). */ +/* */ +/* Copyright 2004, 2005, 2006 by */ +/* Masatake YAMATO, Redhat K.K, */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGXVAL_H__ +#define __FTGXVAL_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* gx_validation */ + /* */ + /* <Title> */ + /* TrueTypeGX/AAT Validation */ + /* */ + /* <Abstract> */ + /* An API to validate TrueTypeGX/AAT tables. */ + /* */ + /* <Description> */ + /* This section contains the declaration of functions to validate */ + /* some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, */ + /* trak, prop, lcar). */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* Warning: Use FT_VALIDATE_XXX to validate a table. */ + /* Following definitions are for gxvalid developers. */ + /* */ + /* */ + /*************************************************************************/ + +#define FT_VALIDATE_feat_INDEX 0 +#define FT_VALIDATE_mort_INDEX 1 +#define FT_VALIDATE_morx_INDEX 2 +#define FT_VALIDATE_bsln_INDEX 3 +#define FT_VALIDATE_just_INDEX 4 +#define FT_VALIDATE_kern_INDEX 5 +#define FT_VALIDATE_opbd_INDEX 6 +#define FT_VALIDATE_trak_INDEX 7 +#define FT_VALIDATE_prop_INDEX 8 +#define FT_VALIDATE_lcar_INDEX 9 +#define FT_VALIDATE_GX_LAST_INDEX FT_VALIDATE_lcar_INDEX + + + /************************************************************************* + * + * @macro: + * FT_VALIDATE_GX_LENGTH + * + * @description: + * The number of tables checked in this module. Use it as a parameter + * for the `table-length' argument of function @FT_TrueTypeGX_Validate. + */ +#define FT_VALIDATE_GX_LENGTH (FT_VALIDATE_GX_LAST_INDEX + 1) + + /* */ + + /* Up to 0x1000 is used by otvalid. + Ox2xxx is reserved for feature OT extension. */ +#define FT_VALIDATE_GX_START 0x4000 +#define FT_VALIDATE_GX_BITFIELD( tag ) \ + ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX ) + + + /********************************************************************** + * + * @enum: + * FT_VALIDATE_GXXXX + * + * @description: + * A list of bit-field constants used with @FT_TrueTypeGX_Validate to + * indicate which TrueTypeGX/AAT Type tables should be validated. + * + * @values: + * FT_VALIDATE_feat :: + * Validate `feat' table. + * + * FT_VALIDATE_mort :: + * Validate `mort' table. + * + * FT_VALIDATE_morx :: + * Validate `morx' table. + * + * FT_VALIDATE_bsln :: + * Validate `bsln' table. + * + * FT_VALIDATE_just :: + * Validate `just' table. + * + * FT_VALIDATE_kern :: + * Validate `kern' table. + * + * FT_VALIDATE_opbd :: + * Validate `opbd' table. + * + * FT_VALIDATE_trak :: + * Validate `trak' table. + * + * FT_VALIDATE_prop :: + * Validate `prop' table. + * + * FT_VALIDATE_lcar :: + * Validate `lcar' table. + * + * FT_VALIDATE_GX :: + * Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern, + * opbd, trak, prop and lcar). + * + */ + +#define FT_VALIDATE_feat FT_VALIDATE_GX_BITFIELD( feat ) +#define FT_VALIDATE_mort FT_VALIDATE_GX_BITFIELD( mort ) +#define FT_VALIDATE_morx FT_VALIDATE_GX_BITFIELD( morx ) +#define FT_VALIDATE_bsln FT_VALIDATE_GX_BITFIELD( bsln ) +#define FT_VALIDATE_just FT_VALIDATE_GX_BITFIELD( just ) +#define FT_VALIDATE_kern FT_VALIDATE_GX_BITFIELD( kern ) +#define FT_VALIDATE_opbd FT_VALIDATE_GX_BITFIELD( opbd ) +#define FT_VALIDATE_trak FT_VALIDATE_GX_BITFIELD( trak ) +#define FT_VALIDATE_prop FT_VALIDATE_GX_BITFIELD( prop ) +#define FT_VALIDATE_lcar FT_VALIDATE_GX_BITFIELD( lcar ) + +#define FT_VALIDATE_GX ( FT_VALIDATE_feat | \ + FT_VALIDATE_mort | \ + FT_VALIDATE_morx | \ + FT_VALIDATE_bsln | \ + FT_VALIDATE_just | \ + FT_VALIDATE_kern | \ + FT_VALIDATE_opbd | \ + FT_VALIDATE_trak | \ + FT_VALIDATE_prop | \ + FT_VALIDATE_lcar ) + + + /* */ + + /********************************************************************** + * + * @function: + * FT_TrueTypeGX_Validate + * + * @description: + * Validate various TrueTypeGX tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library which + * actually does the text layout can access those tables without + * error checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field which specifies the tables to be validated. See + * @FT_VALIDATE_GXXXX for possible values. + * + * table_length :: + * The size of the `tables' array. Normally, @FT_VALIDATE_GX_LENGTH + * should be passed. + * + * @output: + * tables :: + * The array where all validated sfnt tables are stored. + * The array itself must be allocated by a client. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function only works with TrueTypeGX fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the buffers pointed to by + * each `tables' element, by calling @FT_TrueTypeGX_Free. A NULL value + * indicates that the table either doesn't exist in the font, the + * application hasn't asked for validation, or the validator doesn't have + * the ability to validate the sfnt table. + */ + FT_EXPORT( FT_Error ) + FT_TrueTypeGX_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ); + + + /* */ + + /********************************************************************** + * + * @function: + * FT_TrueTypeGX_Free + * + * @description: + * Free the buffer allocated by TrueTypeGX validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer allocated by + * @FT_TrueTypeGX_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_TrueTypeGX_Validate only. + */ + FT_EXPORT( void ) + FT_TrueTypeGX_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + /********************************************************************** + * + * @enum: + * FT_VALIDATE_CKERNXXX + * + * @description: + * A list of bit-field constants used with @FT_ClassicKern_Validate + * to indicate the classic kern dialect or dialects. If the selected + * type doesn't fit, @FT_ClassicKern_Validate regards the table as + * invalid. + * + * @values: + * FT_VALIDATE_MS :: + * Handle the `kern' table as a classic Microsoft kern table. + * + * FT_VALIDATE_APPLE :: + * Handle the `kern' table as a classic Apple kern table. + * + * FT_VALIDATE_CKERN :: + * Handle the `kern' as either classic Apple or Microsoft kern table. + */ +#define FT_VALIDATE_MS ( FT_VALIDATE_GX_START << 0 ) +#define FT_VALIDATE_APPLE ( FT_VALIDATE_GX_START << 1 ) + +#define FT_VALIDATE_CKERN ( FT_VALIDATE_MS | FT_VALIDATE_APPLE ) + + + /* */ + + /********************************************************************** + * + * @function: + * FT_ClassicKern_Validate + * + * @description: + * Validate classic (16bit format) kern table to assure that the offsets + * and indices are valid. The idea is that a higher-level library which + * actually does the text layout can access those tables without error + * checking (which can be quite time consuming). + * + * The `kern' table validator in @FT_TrueTypeGX_Validate deals with both + * the new 32bit format and the classic 16bit format, while + * FT_ClassicKern_Validate only supports the classic 16bit format. + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field which specifies the dialect to be validated. See + * @FT_VALIDATE_CKERNXXX for possible values. + * + * @output: + * ckern_table :: + * A pointer to the kern table. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * After use, the application should deallocate the buffers pointed to by + * `ckern_table', by calling @FT_ClassicKern_Free. A NULL value + * indicates that the table doesn't exist in the font. + */ + FT_EXPORT( FT_Error ) + FT_ClassicKern_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *ckern_table ); + + + /* */ + + /********************************************************************** + * + * @function: + * FT_ClassicKern_Free + * + * @description: + * Free the buffer allocated by classic Kern validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_ClassicKern_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_ClassicKern_Validate only. + */ + FT_EXPORT( void ) + FT_ClassicKern_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTGXVAL_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftgzip.h b/libIGraph/include/freetype/ftgzip.h new file mode 100644 index 0000000..9893437 --- /dev/null +++ b/libIGraph/include/freetype/ftgzip.h @@ -0,0 +1,102 @@ +/***************************************************************************/ +/* */ +/* ftgzip.h */ +/* */ +/* Gzip-compressed stream support. */ +/* */ +/* Copyright 2002, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGZIP_H__ +#define __FTGZIP_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* <Section> */ + /* gzip */ + /* */ + /* <Title> */ + /* GZIP Streams */ + /* */ + /* <Abstract> */ + /* Using gzip-compressed font files. */ + /* */ + /* <Description> */ + /* This section contains the declaration of Gzip-specific functions. */ + /* */ + /*************************************************************************/ + + + /************************************************************************ + * + * @function: + * FT_Stream_OpenGzip + * + * @description: + * Open a new stream to parse gzip-compressed font files. This is + * mainly used to support the compressed `*.pcf.gz' fonts that come + * with XFree86. + * + * @input: + * stream :: + * The target embedding stream. + * + * source :: + * The source stream. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close' on the new stream will + * *not* call `FT_Stream_Close' on the source stream. None of the stream + * objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream. + * + * In certain builds of the library, gzip compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a gzipped stream from + * it and re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature' if your build + * of FreeType was not compiled with zlib support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenGzip( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTGZIP_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftimage.h b/libIGraph/include/freetype/ftimage.h new file mode 100644 index 0000000..1c428f1 --- /dev/null +++ b/libIGraph/include/freetype/ftimage.h @@ -0,0 +1,1237 @@ +/***************************************************************************/ +/* */ +/* ftimage.h */ +/* */ +/* FreeType glyph image formats and default raster interface */ +/* (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Note: A `raster' is simply a scan-line converter, used to render */ + /* FT_Outlines into FT_Bitmaps. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTIMAGE_H__ +#define __FTIMAGE_H__ + + +/* _STANDALONE_ is from ftgrays.c */ +#ifndef _STANDALONE_ +#include <ft2build.h> +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* basic_types */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Pos */ + /* */ + /* <Description> */ + /* The type FT_Pos is a 32-bit integer used to store vectorial */ + /* coordinates. Depending on the context, these can represent */ + /* distances in integer font units, or 16,16, or 26.6 fixed float */ + /* pixel coordinates. */ + /* */ + typedef signed long FT_Pos; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Vector */ + /* */ + /* <Description> */ + /* A simple structure used to store a 2D vector; coordinates are of */ + /* the FT_Pos type. */ + /* */ + /* <Fields> */ + /* x :: The horizontal coordinate. */ + /* y :: The vertical coordinate. */ + /* */ + typedef struct FT_Vector_ + { + FT_Pos x; + FT_Pos y; + + } FT_Vector; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_BBox */ + /* */ + /* <Description> */ + /* A structure used to hold an outline's bounding box, i.e., the */ + /* coordinates of its extrema in the horizontal and vertical */ + /* directions. */ + /* */ + /* <Fields> */ + /* xMin :: The horizontal minimum (left-most). */ + /* */ + /* yMin :: The vertical minimum (bottom-most). */ + /* */ + /* xMax :: The horizontal maximum (right-most). */ + /* */ + /* yMax :: The vertical maximum (top-most). */ + /* */ + typedef struct FT_BBox_ + { + FT_Pos xMin, yMin; + FT_Pos xMax, yMax; + + } FT_BBox; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Pixel_Mode */ + /* */ + /* <Description> */ + /* An enumeration type used to describe the format of pixels in a */ + /* given bitmap. Note that additional formats may be added in the */ + /* future. */ + /* */ + /* <Values> */ + /* FT_PIXEL_MODE_NONE :: */ + /* Value 0 is reserved. */ + /* */ + /* FT_PIXEL_MODE_MONO :: */ + /* A monochrome bitmap, using 1 bit per pixel. Note that pixels */ + /* are stored in most-significant order (MSB), which means that */ + /* the left-most pixel in a byte has value 128. */ + /* */ + /* FT_PIXEL_MODE_GRAY :: */ + /* An 8-bit bitmap, generally used to represent anti-aliased glyph */ + /* images. Each pixel is stored in one byte. Note that the number */ + /* of value `gray' levels is stored in the `num_bytes' field of */ + /* the @FT_Bitmap structure (it generally is 256). */ + /* */ + /* FT_PIXEL_MODE_GRAY2 :: */ + /* A 2-bit/pixel bitmap, used to represent embedded anti-aliased */ + /* bitmaps in font files according to the OpenType specification. */ + /* We haven't found a single font using this format, however. */ + /* */ + /* FT_PIXEL_MODE_GRAY4 :: */ + /* A 4-bit/pixel bitmap, used to represent embedded anti-aliased */ + /* bitmaps in font files according to the OpenType specification. */ + /* We haven't found a single font using this format, however. */ + /* */ + /* FT_PIXEL_MODE_LCD :: */ + /* An 8-bit bitmap, used to represent RGB or BGR decimated glyph */ + /* images used for display on LCD displays; the bitmap is three */ + /* times wider than the original glyph image. See also */ + /* @FT_RENDER_MODE_LCD. */ + /* */ + /* FT_PIXEL_MODE_LCD_V :: */ + /* An 8-bit bitmap, used to represent RGB or BGR decimated glyph */ + /* images used for display on rotated LCD displays; the bitmap */ + /* is three times taller than the original glyph image. See also */ + /* @FT_RENDER_MODE_LCD_V. */ + /* */ + typedef enum FT_Pixel_Mode_ + { + FT_PIXEL_MODE_NONE = 0, + FT_PIXEL_MODE_MONO, + FT_PIXEL_MODE_GRAY, + FT_PIXEL_MODE_GRAY2, + FT_PIXEL_MODE_GRAY4, + FT_PIXEL_MODE_LCD, + FT_PIXEL_MODE_LCD_V, + + FT_PIXEL_MODE_MAX /* do not remove */ + + } FT_Pixel_Mode; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_pixel_mode_xxx */ + /* */ + /* <Description> */ + /* A list of deprecated constants. Use the corresponding */ + /* @FT_Pixel_Mode values instead. */ + /* */ + /* <Values> */ + /* ft_pixel_mode_none :: See @FT_PIXEL_MODE_NONE. */ + /* ft_pixel_mode_mono :: See @FT_PIXEL_MODE_MONO. */ + /* ft_pixel_mode_grays :: See @FT_PIXEL_MODE_GRAY. */ + /* ft_pixel_mode_pal2 :: See @FT_PIXEL_MODE_GRAY2. */ + /* ft_pixel_mode_pal4 :: See @FT_PIXEL_MODE_GRAY4. */ + /* */ +#define ft_pixel_mode_none FT_PIXEL_MODE_NONE +#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO +#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY +#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2 +#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4 + + /* */ + +#if 0 + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Palette_Mode */ + /* */ + /* <Description> */ + /* THIS TYPE IS DEPRECATED. DO NOT USE IT! */ + /* */ + /* An enumeration type to describe the format of a bitmap palette, */ + /* used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8. */ + /* */ + /* <Fields> */ + /* ft_palette_mode_rgb :: The palette is an array of 3-bytes RGB */ + /* records. */ + /* */ + /* ft_palette_mode_rgba :: The palette is an array of 4-bytes RGBA */ + /* records. */ + /* */ + /* <Note> */ + /* As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by */ + /* FreeType, these types are not handled by the library itself. */ + /* */ + typedef enum FT_Palette_Mode_ + { + ft_palette_mode_rgb = 0, + ft_palette_mode_rgba, + + ft_palettte_mode_max /* do not remove */ + + } FT_Palette_Mode; + + /* */ + +#endif + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Bitmap */ + /* */ + /* <Description> */ + /* A structure used to describe a bitmap or pixmap to the raster. */ + /* Note that we now manage pixmaps of various depths through the */ + /* `pixel_mode' field. */ + /* */ + /* <Fields> */ + /* rows :: The number of bitmap rows. */ + /* */ + /* width :: The number of pixels in bitmap row. */ + /* */ + /* pitch :: The pitch's absolute value is the number of bytes */ + /* taken by one bitmap row, including padding. */ + /* However, the pitch is positive when the bitmap has */ + /* a `down' flow, and negative when it has an `up' */ + /* flow. In all cases, the pitch is an offset to add */ + /* to a bitmap pointer in order to go down one row. */ + /* */ + /* buffer :: A typeless pointer to the bitmap buffer. This */ + /* value should be aligned on 32-bit boundaries in */ + /* most cases. */ + /* */ + /* num_grays :: This field is only used with */ + /* @FT_PIXEL_MODE_GRAY; it gives the number of gray */ + /* levels used in the bitmap. */ + /* */ + /* pixel_mode :: The pixel mode, i.e., how pixel bits are stored. */ + /* See @FT_Pixel_Mode for possible values. */ + /* */ + /* palette_mode :: This field is intended for paletted pixel modes; */ + /* it indicates how the palette is stored. Not */ + /* used currently. */ + /* */ + /* palette :: A typeless pointer to the bitmap palette; this */ + /* field is intended for paletted pixel modes. Not */ + /* used currently. */ + /* */ + /* <Note> */ + /* For now, the only pixel modes supported by FreeType are mono and */ + /* grays. However, drivers might be added in the future to support */ + /* more `colorful' options. */ + /* */ + typedef struct FT_Bitmap_ + { + int rows; + int width; + int pitch; + unsigned char* buffer; + short num_grays; + char pixel_mode; + char palette_mode; + void* palette; + + } FT_Bitmap; + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* outline_processing */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Outline */ + /* */ + /* <Description> */ + /* This structure is used to describe an outline to the scan-line */ + /* converter. */ + /* */ + /* <Fields> */ + /* n_contours :: The number of contours in the outline. */ + /* */ + /* n_points :: The number of points in the outline. */ + /* */ + /* points :: A pointer to an array of `n_points' @FT_Vector */ + /* elements, giving the outline's point coordinates. */ + /* */ + /* tags :: A pointer to an array of `n_points' chars, giving */ + /* each outline point's type. If bit 0 is unset, the */ + /* point is `off' the curve, i.e., a Bézier control */ + /* point, while it is `on' when set. */ + /* */ + /* Bit 1 is meaningful for `off' points only. If set, */ + /* it indicates a third-order Bézier arc control point; */ + /* and a second-order control point if unset. */ + /* */ + /* contours :: An array of `n_contours' shorts, giving the end */ + /* point of each contour within the outline. For */ + /* example, the first contour is defined by the points */ + /* `0' to `contours[0]', the second one is defined by */ + /* the points `contours[0]+1' to `contours[1]', etc. */ + /* */ + /* flags :: A set of bit flags used to characterize the outline */ + /* and give hints to the scan-converter and hinter on */ + /* how to convert/grid-fit it. See @FT_OUTLINE_FLAGS. */ + /* */ + typedef struct FT_Outline_ + { + short n_contours; /* number of contours in glyph */ + short n_points; /* number of points in the glyph */ + + FT_Vector* points; /* the outline's points */ + char* tags; /* the points flags */ + short* contours; /* the contour end points */ + + int flags; /* outline masks */ + + } FT_Outline; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_OUTLINE_FLAGS */ + /* */ + /* <Description> */ + /* A list of bit-field constants use for the flags in an outline's */ + /* `flags' field. */ + /* */ + /* <Values> */ + /* FT_OUTLINE_NONE :: Value 0 is reserved. */ + /* */ + /* FT_OUTLINE_OWNER :: If set, this flag indicates that the */ + /* outline's field arrays (i.e., */ + /* `points', `flags' & `contours') are */ + /* `owned' by the outline object, and */ + /* should thus be freed when it is */ + /* destroyed. */ + /* */ + /* FT_OUTLINE_EVEN_ODD_FILL :: By default, outlines are filled using */ + /* the non-zero winding rule. If set to */ + /* 1, the outline will be filled using */ + /* the even-odd fill rule (only works */ + /* with the smooth raster). */ + /* */ + /* FT_OUTLINE_REVERSE_FILL :: By default, outside contours of an */ + /* outline are oriented in clock-wise */ + /* direction, as defined in the TrueType */ + /* specification. This flag is set if */ + /* the outline uses the opposite */ + /* direction (typically for Type 1 */ + /* fonts). This flag is ignored by the */ + /* scan-converter. */ + /* */ + /* FT_OUTLINE_IGNORE_DROPOUTS :: By default, the scan converter will */ + /* try to detect drop-outs in an outline */ + /* and correct the glyph bitmap to */ + /* ensure consistent shape continuity. */ + /* If set, this flag hints the scan-line */ + /* converter to ignore such cases. */ + /* */ + /* FT_OUTLINE_HIGH_PRECISION :: This flag indicates that the */ + /* scan-line converter should try to */ + /* convert this outline to bitmaps with */ + /* the highest possible quality. It is */ + /* typically set for small character */ + /* sizes. Note that this is only a */ + /* hint, that might be completely */ + /* ignored by a given scan-converter. */ + /* */ + /* FT_OUTLINE_SINGLE_PASS :: This flag is set to force a given */ + /* scan-converter to only use a single */ + /* pass over the outline to render a */ + /* bitmap glyph image. Normally, it is */ + /* set for very large character sizes. */ + /* It is only a hint, that might be */ + /* completely ignored by a given */ + /* scan-converter. */ + /* */ +#define FT_OUTLINE_NONE 0x0 +#define FT_OUTLINE_OWNER 0x1 +#define FT_OUTLINE_EVEN_ODD_FILL 0x2 +#define FT_OUTLINE_REVERSE_FILL 0x4 +#define FT_OUTLINE_IGNORE_DROPOUTS 0x8 + +#define FT_OUTLINE_HIGH_PRECISION 0x100 +#define FT_OUTLINE_SINGLE_PASS 0x200 + + + /************************************************************************* + * + * @enum: + * ft_outline_flags + * + * @description: + * These constants are deprecated. Please use the corresponding + * @FT_OUTLINE_FLAGS values. + * + * @values: + * ft_outline_none :: See @FT_OUTLINE_NONE. + * ft_outline_owner :: See @FT_OUTLINE_OWNER. + * ft_outline_even_odd_fill :: See @FT_OUTLINE_EVEN_ODD_FILL. + * ft_outline_reverse_fill :: See @FT_OUTLINE_REVERSE_FILL. + * ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS. + * ft_outline_high_precision :: See @FT_OUTLINE_HIGH_PRECISION. + * ft_outline_single_pass :: See @FT_OUTLINE_SINGLE_PASS. + */ +#define ft_outline_none FT_OUTLINE_NONE +#define ft_outline_owner FT_OUTLINE_OWNER +#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL +#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL +#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS +#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION +#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS + + /* */ + +#define FT_CURVE_TAG( flag ) ( flag & 3 ) + +#define FT_CURVE_TAG_ON 1 +#define FT_CURVE_TAG_CONIC 0 +#define FT_CURVE_TAG_CUBIC 2 + +#define FT_CURVE_TAG_TOUCH_X 8 /* reserved for the TrueType hinter */ +#define FT_CURVE_TAG_TOUCH_Y 16 /* reserved for the TrueType hinter */ + +#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \ + FT_CURVE_TAG_TOUCH_Y ) + +#define FT_Curve_Tag_On FT_CURVE_TAG_ON +#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC +#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC +#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X +#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_MoveToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `move */ + /* to' function during outline walking/decomposition. */ + /* */ + /* A `move to' is emitted to start a new contour in an outline. */ + /* */ + /* <Input> */ + /* to :: A pointer to the target point of the `move to'. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of the */ + /* decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0 means success. */ + /* */ + typedef int + (*FT_Outline_MoveToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_LineToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `line */ + /* to' function during outline walking/decomposition. */ + /* */ + /* A `line to' is emitted to indicate a segment in the outline. */ + /* */ + /* <Input> */ + /* to :: A pointer to the target point of the `line to'. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of the */ + /* decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0 means success. */ + /* */ + typedef int + (*FT_Outline_LineToFunc)( const FT_Vector* to, + void* user ); + +#define FT_Outline_LineTo_Func FT_Outline_LineToFunc + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_ConicToFunc */ + /* */ + /* <Description> */ + /* A function pointer type use to describe the signature of a `conic */ + /* to' function during outline walking/decomposition. */ + /* */ + /* A `conic to' is emitted to indicate a second-order Bézier arc in */ + /* the outline. */ + /* */ + /* <Input> */ + /* control :: An intermediate control point between the last position */ + /* and the new target in `to'. */ + /* */ + /* to :: A pointer to the target end point of the conic arc. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of */ + /* the decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0 means success. */ + /* */ + typedef int + (*FT_Outline_ConicToFunc)( const FT_Vector* control, + const FT_Vector* to, + void* user ); + +#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Outline_CubicToFunc */ + /* */ + /* <Description> */ + /* A function pointer type used to describe the signature of a `cubic */ + /* to' function during outline walking/decomposition. */ + /* */ + /* A `cubic to' is emitted to indicate a third-order Bézier arc. */ + /* */ + /* <Input> */ + /* control1 :: A pointer to the first Bézier control point. */ + /* */ + /* control2 :: A pointer to the second Bézier control point. */ + /* */ + /* to :: A pointer to the target end point. */ + /* */ + /* user :: A typeless pointer which is passed from the caller of */ + /* the decomposition function. */ + /* */ + /* <Return> */ + /* Error code. 0 means success. */ + /* */ + typedef int + (*FT_Outline_CubicToFunc)( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + void* user ); + +#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Outline_Funcs */ + /* */ + /* <Description> */ + /* A structure to hold various function pointers used during outline */ + /* decomposition in order to emit segments, conic, and cubic Béziers, */ + /* as well as `move to' and `close to' operations. */ + /* */ + /* <Fields> */ + /* move_to :: The `move to' emitter. */ + /* */ + /* line_to :: The segment emitter. */ + /* */ + /* conic_to :: The second-order Bézier arc emitter. */ + /* */ + /* cubic_to :: The third-order Bézier arc emitter. */ + /* */ + /* shift :: The shift that is applied to coordinates before they */ + /* are sent to the emitter. */ + /* */ + /* delta :: The delta that is applied to coordinates before they */ + /* are sent to the emitter, but after the shift. */ + /* */ + /* <Note> */ + /* The point coordinates sent to the emitters are the transformed */ + /* version of the original coordinates (this is important for high */ + /* accuracy during scan-conversion). The transformation is simple: */ + /* */ + /* { */ + /* x' = (x << shift) - delta */ + /* y' = (x << shift) - delta */ + /* } */ + /* */ + /* Set the value of `shift' and `delta' to 0 to get the original */ + /* point coordinates. */ + /* */ + typedef struct FT_Outline_Funcs_ + { + FT_Outline_MoveToFunc move_to; + FT_Outline_LineToFunc line_to; + FT_Outline_ConicToFunc conic_to; + FT_Outline_CubicToFunc cubic_to; + + int shift; + FT_Pos delta; + + } FT_Outline_Funcs; + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* basic_types */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_IMAGE_TAG */ + /* */ + /* <Description> */ + /* This macro converts four-letter tags to an unsigned long type. */ + /* */ + /* <Note> */ + /* Since many 16bit compilers don't like 32bit enumerations, you */ + /* should redefine this macro in case of problems to something like */ + /* this: */ + /* */ + /* { */ + /* #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value */ + /* } */ + /* */ + /* to get a simple enumeration without assigning special numbers. */ + /* */ +#ifndef FT_IMAGE_TAG +#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \ + value = ( ( (unsigned long)_x1 << 24 ) | \ + ( (unsigned long)_x2 << 16 ) | \ + ( (unsigned long)_x3 << 8 ) | \ + (unsigned long)_x4 ) +#endif /* FT_IMAGE_TAG */ + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Glyph_Format */ + /* */ + /* <Description> */ + /* An enumeration type used to describe the format of a given glyph */ + /* image. Note that this version of FreeType only supports two image */ + /* formats, even though future font drivers will be able to register */ + /* their own format. */ + /* */ + /* <Values> */ + /* FT_GLYPH_FORMAT_NONE :: */ + /* The value 0 is reserved. */ + /* */ + /* FT_GLYPH_FORMAT_COMPOSITE :: */ + /* The glyph image is a composite of several other images. This */ + /* format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to */ + /* report compound glyphs (like accented characters). */ + /* */ + /* FT_GLYPH_FORMAT_BITMAP :: */ + /* The glyph image is a bitmap, and can be described as an */ + /* @FT_Bitmap. You generally need to access the `bitmap' field of */ + /* the @FT_GlyphSlotRec structure to read it. */ + /* */ + /* FT_GLYPH_FORMAT_OUTLINE :: */ + /* The glyph image is a vectorial outline made of line segments */ + /* and Bézier arcs; it can be described as an @FT_Outline; you */ + /* generally want to access the `outline' field of the */ + /* @FT_GlyphSlotRec structure to read it. */ + /* */ + /* FT_GLYPH_FORMAT_PLOTTER :: */ + /* The glyph image is a vectorial path with no inside and outside */ + /* contours. Some Type 1 fonts, like those in the Hershey family, */ + /* contain glyphs in this format. These are described as */ + /* @FT_Outline, but FreeType isn't currently capable of rendering */ + /* them correctly. */ + /* */ + typedef enum FT_Glyph_Format_ + { + FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ), + + FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ), + FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' ) + + } FT_Glyph_Format; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* ft_glyph_format_xxx */ + /* */ + /* <Description> */ + /* A list of deprecated constants. Use the corresponding */ + /* @FT_Glyph_Format values instead. */ + /* */ + /* <Values> */ + /* ft_glyph_format_none :: See @FT_GLYPH_FORMAT_NONE. */ + /* ft_glyph_format_composite :: See @FT_GLYPH_FORMAT_COMPOSITE. */ + /* ft_glyph_format_bitmap :: See @FT_GLYPH_FORMAT_BITMAP. */ + /* ft_glyph_format_outline :: See @FT_GLYPH_FORMAT_OUTLINE. */ + /* ft_glyph_format_plotter :: See @FT_GLYPH_FORMAT_PLOTTER. */ + /* */ +#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE +#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE +#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP +#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE +#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** R A S T E R D E F I N I T I O N S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* A raster is a scan converter, in charge of rendering an outline into */ + /* a a bitmap. This section contains the public API for rasters. */ + /* */ + /* Note that in FreeType 2, all rasters are now encapsulated within */ + /* specific modules called `renderers'. See `freetype/ftrender.h' for */ + /* more details on renderers. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* raster */ + /* */ + /* <Title> */ + /* Scanline Converter */ + /* */ + /* <Abstract> */ + /* How vectorial outlines are converted into bitmaps and pixmaps. */ + /* */ + /* <Description> */ + /* This section contains technical definitions. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Raster */ + /* */ + /* <Description> */ + /* A handle (pointer) to a raster object. Each object can be used */ + /* independently to convert an outline into a bitmap or pixmap. */ + /* */ + typedef struct FT_RasterRec_* FT_Raster; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Span */ + /* */ + /* <Description> */ + /* A structure used to model a single span of gray (or black) pixels */ + /* when rendering a monochrome or anti-aliased bitmap. */ + /* */ + /* <Fields> */ + /* x :: The span's horizontal start position. */ + /* */ + /* len :: The span's length in pixels. */ + /* */ + /* coverage :: The span color/coverage, ranging from 0 (background) */ + /* to 255 (foreground). Only used for anti-aliased */ + /* rendering. */ + /* */ + /* <Note> */ + /* This structure is used by the span drawing callback type named */ + /* @FT_SpanFunc which takes the y-coordinate of the span as a */ + /* a parameter. */ + /* */ + /* The coverage value is always between 0 and 255. */ + /* */ + typedef struct FT_Span_ + { + short x; + unsigned short len; + unsigned char coverage; + + } FT_Span; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_SpanFunc */ + /* */ + /* <Description> */ + /* A function used as a call-back by the anti-aliased renderer in */ + /* order to let client applications draw themselves the gray pixel */ + /* spans on each scan line. */ + /* */ + /* <Input> */ + /* y :: The scanline's y-coordinate. */ + /* */ + /* count :: The number of spans to draw on this scanline. */ + /* */ + /* spans :: A table of `count' spans to draw on the scanline. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* <Note> */ + /* This callback allows client applications to directly render the */ + /* gray spans of the anti-aliased bitmap to any kind of surfaces. */ + /* */ + /* This can be used to write anti-aliased outlines directly to a */ + /* given background bitmap, and even perform translucency. */ + /* */ + /* Note that the `count' field cannot be greater than a fixed value */ + /* defined by the `FT_MAX_GRAY_SPANS' configuration macro in */ + /* `ftoption.h'. By default, this value is set to 32, which means */ + /* that if there are more than 32 spans on a given scanline, the */ + /* callback is called several times with the same `y' parameter in */ + /* order to draw all callbacks. */ + /* */ + /* Otherwise, the callback is only called once per scan-line, and */ + /* only for those scanlines that do have `gray' pixels on them. */ + /* */ + typedef void + (*FT_SpanFunc)( int y, + int count, + const FT_Span* spans, + void* user ); + +#define FT_Raster_Span_Func FT_SpanFunc + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_BitTest_Func */ + /* */ + /* <Description> */ + /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */ + /* */ + /* A function used as a call-back by the monochrome scan-converter */ + /* to test whether a given target pixel is already set to the drawing */ + /* `color'. These tests are crucial to implement drop-out control */ + /* per-se the TrueType spec. */ + /* */ + /* <Input> */ + /* y :: The pixel's y-coordinate. */ + /* */ + /* x :: The pixel's x-coordinate. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* <Return> */ + /* 1 if the pixel is `set', 0 otherwise. */ + /* */ + typedef int + (*FT_Raster_BitTest_Func)( int y, + int x, + void* user ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_BitSet_Func */ + /* */ + /* <Description> */ + /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */ + /* */ + /* A function used as a call-back by the monochrome scan-converter */ + /* to set an individual target pixel. This is crucial to implement */ + /* drop-out control according to the TrueType specification. */ + /* */ + /* <Input> */ + /* y :: The pixel's y-coordinate. */ + /* */ + /* x :: The pixel's x-coordinate. */ + /* */ + /* user :: User-supplied data that is passed to the callback. */ + /* */ + /* <Return> */ + /* 1 if the pixel is `set', 0 otherwise. */ + /* */ + typedef void + (*FT_Raster_BitSet_Func)( int y, + int x, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_RASTER_FLAG_XXX */ + /* */ + /* <Description> */ + /* A list of bit flag constants as used in the `flags' field of a */ + /* @FT_Raster_Params structure. */ + /* */ + /* <Values> */ + /* FT_RASTER_FLAG_DEFAULT :: This value is 0. */ + /* */ + /* FT_RASTER_FLAG_AA :: This flag is set to indicate that an */ + /* anti-aliased glyph image should be */ + /* generated. Otherwise, it will be */ + /* monochrome (1-bit). */ + /* */ + /* FT_RASTER_FLAG_DIRECT :: This flag is set to indicate direct */ + /* rendering. In this mode, client */ + /* applications must provide their own span */ + /* callback. This lets them directly */ + /* draw or compose over an existing bitmap. */ + /* If this bit is not set, the target */ + /* pixmap's buffer _must_ be zeroed before */ + /* rendering. */ + /* */ + /* Note that for now, direct rendering is */ + /* only possible with anti-aliased glyphs. */ + /* */ + /* FT_RASTER_FLAG_CLIP :: This flag is only used in direct */ + /* rendering mode. If set, the output will */ + /* be clipped to a box specified in the */ + /* `clip_box' field of the */ + /* @FT_Raster_Params structure. */ + /* */ + /* Note that by default, the glyph bitmap */ + /* is clipped to the target pixmap, except */ + /* in direct rendering mode where all spans */ + /* are generated if no clipping box is set. */ + /* */ +#define FT_RASTER_FLAG_DEFAULT 0x0 +#define FT_RASTER_FLAG_AA 0x1 +#define FT_RASTER_FLAG_DIRECT 0x2 +#define FT_RASTER_FLAG_CLIP 0x4 + + /* deprecated */ +#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT +#define ft_raster_flag_aa FT_RASTER_FLAG_AA +#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT +#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Raster_Params */ + /* */ + /* <Description> */ + /* A structure to hold the arguments used by a raster's render */ + /* function. */ + /* */ + /* <Fields> */ + /* target :: The target bitmap. */ + /* */ + /* source :: A pointer to the source glyph image (e.g., an */ + /* @FT_Outline). */ + /* */ + /* flags :: The rendering flags. */ + /* */ + /* gray_spans :: The gray span drawing callback. */ + /* */ + /* black_spans :: The black span drawing callback. */ + /* */ + /* bit_test :: The bit test callback. UNIMPLEMENTED! */ + /* */ + /* bit_set :: The bit set callback. UNIMPLEMENTED! */ + /* */ + /* user :: User-supplied data that is passed to each drawing */ + /* callback. */ + /* */ + /* clip_box :: An optional clipping box. It is only used in */ + /* direct rendering mode. Note that coordinates here */ + /* should be expressed in _integer_ pixels (and not in */ + /* 26.6 fixed-point units). */ + /* */ + /* <Note> */ + /* An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA */ + /* bit flag is set in the `flags' field, otherwise a monochrome */ + /* bitmap is generated. */ + /* */ + /* If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the */ + /* raster will call the `gray_spans' callback to draw gray pixel */ + /* spans, in the case of an aa glyph bitmap, it will call */ + /* `black_spans', and `bit_test' and `bit_set' in the case of a */ + /* monochrome bitmap. This allows direct composition over a */ + /* pre-existing bitmap through user-provided callbacks to perform the */ + /* span drawing/composition. */ + /* */ + /* Note that the `bit_test' and `bit_set' callbacks are required when */ + /* rendering a monochrome bitmap, as they are crucial to implement */ + /* correct drop-out control as defined in the TrueType specification. */ + /* */ + typedef struct FT_Raster_Params_ + { + const FT_Bitmap* target; + const void* source; + int flags; + FT_SpanFunc gray_spans; + FT_SpanFunc black_spans; + FT_Raster_BitTest_Func bit_test; /* doesn't work! */ + FT_Raster_BitSet_Func bit_set; /* doesn't work! */ + void* user; + FT_BBox clip_box; + + } FT_Raster_Params; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_NewFunc */ + /* */ + /* <Description> */ + /* A function used to create a new raster object. */ + /* */ + /* <Input> */ + /* memory :: A handle to the memory allocator. */ + /* */ + /* <Output> */ + /* raster :: A handle to the new raster object. */ + /* */ + /* <Return> */ + /* Error code. 0 means success. */ + /* */ + /* <Note> */ + /* The `memory' parameter is a typeless pointer in order to avoid */ + /* un-wanted dependencies on the rest of the FreeType code. In */ + /* practice, it is an @FT_Memory object, i.e., a handle to the */ + /* standard FreeType memory allocator. However, this field can be */ + /* completely ignored by a given raster implementation. */ + /* */ + typedef int + (*FT_Raster_NewFunc)( void* memory, + FT_Raster* raster ); + +#define FT_Raster_New_Func FT_Raster_NewFunc + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_DoneFunc */ + /* */ + /* <Description> */ + /* A function used to destroy a given raster object. */ + /* */ + /* <Input> */ + /* raster :: A handle to the raster object. */ + /* */ + typedef void + (*FT_Raster_DoneFunc)( FT_Raster raster ); + +#define FT_Raster_Done_Func FT_Raster_DoneFunc + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_ResetFunc */ + /* */ + /* <Description> */ + /* FreeType provides an area of memory called the `render pool', */ + /* available to all registered rasters. This pool can be freely used */ + /* during a given scan-conversion but is shared by all rasters. Its */ + /* content is thus transient. */ + /* */ + /* This function is called each time the render pool changes, or just */ + /* after a new raster object is created. */ + /* */ + /* <Input> */ + /* raster :: A handle to the new raster object. */ + /* */ + /* pool_base :: The address in memory of the render pool. */ + /* */ + /* pool_size :: The size in bytes of the render pool. */ + /* */ + /* <Note> */ + /* Rasters can ignore the render pool and rely on dynamic memory */ + /* allocation if they want to (a handle to the memory allocator is */ + /* passed to the raster constructor). However, this is not */ + /* recommended for efficiency purposes. */ + /* */ + typedef void + (*FT_Raster_ResetFunc)( FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ); + +#define FT_Raster_Reset_Func FT_Raster_ResetFunc + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_SetModeFunc */ + /* */ + /* <Description> */ + /* This function is a generic facility to change modes or attributes */ + /* in a given raster. This can be used for debugging purposes, or */ + /* simply to allow implementation-specific `features' in a given */ + /* raster module. */ + /* */ + /* <Input> */ + /* raster :: A handle to the new raster object. */ + /* */ + /* mode :: A 4-byte tag used to name the mode or property. */ + /* */ + /* args :: A pointer to the new mode/property to use. */ + /* */ + typedef int + (*FT_Raster_SetModeFunc)( FT_Raster raster, + unsigned long mode, + void* args ); + +#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Raster_RenderFunc */ + /* */ + /* <Description> */ + /* Invokes a given raster to scan-convert a given glyph image into a */ + /* target bitmap. */ + /* */ + /* <Input> */ + /* raster :: A handle to the raster object. */ + /* */ + /* params :: A pointer to an @FT_Raster_Params structure used to */ + /* store the rendering parameters. */ + /* */ + /* <Return> */ + /* Error code. 0 means success. */ + /* */ + /* <Note> */ + /* The exact format of the source image depends on the raster's glyph */ + /* format defined in its @FT_Raster_Funcs structure. It can be an */ + /* @FT_Outline or anything else in order to support a large array of */ + /* glyph formats. */ + /* */ + /* Note also that the render function can fail and return a */ + /* `FT_Err_Unimplemented_Feature' error code if the raster used does */ + /* not support direct composition. */ + /* */ + /* XXX: For now, the standard raster doesn't support direct */ + /* composition but this should change for the final release (see */ + /* the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c' */ + /* for examples of distinct implementations which support direct */ + /* composition). */ + /* */ + typedef int + (*FT_Raster_RenderFunc)( FT_Raster raster, + const FT_Raster_Params* params ); + +#define FT_Raster_Render_Func FT_Raster_RenderFunc + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Raster_Funcs */ + /* */ + /* <Description> */ + /* A structure used to describe a given raster class to the library. */ + /* */ + /* <Fields> */ + /* glyph_format :: The supported glyph format for this raster. */ + /* */ + /* raster_new :: The raster constructor. */ + /* */ + /* raster_reset :: Used to reset the render pool within the raster. */ + /* */ + /* raster_render :: A function to render a glyph into a given bitmap. */ + /* */ + /* raster_done :: The raster destructor. */ + /* */ + typedef struct FT_Raster_Funcs_ + { + FT_Glyph_Format glyph_format; + FT_Raster_NewFunc raster_new; + FT_Raster_ResetFunc raster_reset; + FT_Raster_SetModeFunc raster_set_mode; + FT_Raster_RenderFunc raster_render; + FT_Raster_DoneFunc raster_done; + + } FT_Raster_Funcs; + + + /* */ + + +FT_END_HEADER + +#endif /* __FTIMAGE_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/libIGraph/include/freetype/ftincrem.h b/libIGraph/include/freetype/ftincrem.h new file mode 100644 index 0000000..46bc8bd --- /dev/null +++ b/libIGraph/include/freetype/ftincrem.h @@ -0,0 +1,331 @@ +/***************************************************************************/ +/* */ +/* ftincrem.h */ +/* */ +/* FreeType incremental loading (specification). */ +/* */ +/* Copyright 2002, 2003, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTINCREM_H__ +#define __FTINCREM_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************** + * + * @section: + * incremental + * + * @title: + * Incremental Loading + * + * @abstract: + * Custom Glyph Loading. + * + * @description: + * This section contains various functions used to perform so-called + * `incremental' glyph loading. This is a mode where all glyphs loaded + * from a given @FT_Face are provided by the client application, + * + * Apart from that, all other tables are loaded normally from the font + * file. This mode is useful when FreeType is used within another + * engine, e.g., a Postscript Imaging Processor. + * + * To enable this mode, you must use @FT_Open_Face, passing an + * @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an + * @FT_Incremental_Interface value. See the comments for + * @FT_Incremental_InterfaceRec for an example. + * + */ + + + /*************************************************************************** + * + * @type: + * FT_Incremental + * + * @description: + * An opaque type describing a user-provided object used to implement + * `incremental' glyph loading within FreeType. This is used to support + * embedded fonts in certain environments (e.g., Postscript interpreters), + * where the glyph data isn't in the font file, or must be overridden by + * different values. + * + * @note: + * It is up to client applications to create and implement @FT_Incremental + * objects, as long as they provide implementations for the methods + * @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc + * and @FT_Incremental_GetGlyphMetricsFunc. + * + * See the description of @FT_Incremental_InterfaceRec to understand how + * to use incremental objects with FreeType. + */ + typedef struct FT_IncrementalRec_* FT_Incremental; + + + /*************************************************************************** + * + * @struct: + * FT_Incremental_Metrics + * + * @description: + * A small structure used to contain the basic glyph metrics returned + * by the @FT_Incremental_GetGlyphMetricsFunc method. + * + * @fields: + * bearing_x :: + * Left bearing, in font units. + * + * bearing_y :: + * Top bearing, in font units. + * + * advance :: + * Glyph advance, in font units. + * + * @note: + * These correspond to horizontal or vertical metrics depending on the + * value of the `vertical' argument to the function + * @FT_Incremental_GetGlyphMetricsFunc. + */ + typedef struct FT_Incremental_MetricsRec_ + { + FT_Long bearing_x; + FT_Long bearing_y; + FT_Long advance; + + } FT_Incremental_MetricsRec, *FT_Incremental_Metrics; + + + /*************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphDataFunc + * + * @description: + * A function called by FreeType to access a given glyph's data bytes + * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is + * enabled. + * + * Note that the format of the glyph's data bytes depends on the font + * file format. For TrueType, it must correspond to the raw bytes within + * the `glyf' table. For Postscript formats, it must correspond to the + * *unencrypted* charstring bytes, without any `lenIV' header. It is + * undefined for any other format. + * + * @input: + * incremental :: + * Handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * @output: + * adata :: + * A structure describing the returned glyph data bytes (which will be + * accessed as a read-only byte block). + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * If this function returns successfully the method + * @FT_Incremental_FreeGlyphDataFunc will be called later to release + * the data bytes. + * + * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for + * compound glyphs. + */ + typedef FT_Error + (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Data* adata ); + + + /*************************************************************************** + * + * @type: + * FT_Incremental_FreeGlyphDataFunc + * + * @description: + * A function used to release the glyph data bytes returned by a + * successful call to @FT_Incremental_GetGlyphDataFunc. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * data :: + * A structure describing the glyph data bytes (which will be accessed + * as a read-only byte block). + */ + typedef void + (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental, + FT_Data* data ); + + + /*************************************************************************** + * + * @type: + * FT_Incremental_GetGlyphMetricsFunc + * + * @description: + * A function used to retrieve the basic metrics of a given glyph index + * before accessing its data. This is necessary because, in certain + * formats like TrueType, the metrics are stored in a different place from + * the glyph images proper. + * + * @input: + * incremental :: + * A handle to an opaque @FT_Incremental handle provided by the client + * application. + * + * glyph_index :: + * Index of relevant glyph. + * + * vertical :: + * If true, return vertical metrics. + * + * ametrics :: + * This parameter is used for both input and output. + * The original glyph metrics, if any, in font units. If metrics are + * not available all the values must be set to zero. + * + * @output: + * ametrics :: + * The replacement glyph metrics in font units. + * + */ + typedef FT_Error + (*FT_Incremental_GetGlyphMetricsFunc) + ( FT_Incremental incremental, + FT_UInt glyph_index, + FT_Bool vertical, + FT_Incremental_MetricsRec *ametrics ); + + + /************************************************************************** + * + * @struct: + * FT_Incremental_FuncsRec + * + * @description: + * A table of functions for accessing fonts that load data + * incrementally. Used in @FT_Incremental_InterfaceRec. + * + * @fields: + * get_glyph_data :: + * The function to get glyph data. Must not be null. + * + * free_glyph_data :: + * The function to release glyph data. Must not be null. + * + * get_glyph_metrics :: + * The function to get glyph metrics. May be null if the font does + * not provide overriding glyph metrics. + */ + typedef struct FT_Incremental_FuncsRec_ + { + FT_Incremental_GetGlyphDataFunc get_glyph_data; + FT_Incremental_FreeGlyphDataFunc free_glyph_data; + FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics; + + } FT_Incremental_FuncsRec; + + + /*************************************************************************** + * + * @struct: + * FT_Incremental_InterfaceRec + * + * @description: + * A structure to be used with @FT_Open_Face to indicate that the user + * wants to support incremental glyph loading. You should use it with + * @FT_PARAM_TAG_INCREMENTAL as in the following example: + * + * { + * FT_Incremental_InterfaceRec inc_int; + * FT_Parameter parameter; + * FT_Open_Args open_args; + * + * + * // set up incremental descriptor + * inc_int.funcs = my_funcs; + * inc_int.object = my_object; + * + * // set up optional parameter + * parameter.tag = FT_PARAM_TAG_INCREMENTAL; + * parameter.data = &inc_int; + * + * // set up FT_Open_Args structure + * open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; + * open_args.pathname = my_font_pathname; + * open_args.num_params = 1; + * open_args.params = ¶meter; // we use one optional argument + * + * // open the font + * error = FT_Open_Face( library, &open_args, index, &face ); + * ... + * } + */ + typedef struct FT_Incremental_InterfaceRec_ + { + const FT_Incremental_FuncsRec* funcs; + FT_Incremental object; + + } FT_Incremental_InterfaceRec; + + + /*************************************************************************** + * + * @type: + * FT_Incremental_Interface + * + * @description: + * A pointer to an @FT_Incremental_InterfaceRec structure. + * + */ + typedef FT_Incremental_InterfaceRec* FT_Incremental_Interface; + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_INCREMENTAL + * + * @description: + * A constant used as the tag of @FT_Parameter structures to indicate + * an incremental loading object to be used by FreeType. + * + */ +#define FT_PARAM_TAG_INCREMENTAL FT_MAKE_TAG( 'i', 'n', 'c', 'r' ) + + /* */ + +FT_END_HEADER + +#endif /* __FTINCREM_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftlcdfil.h b/libIGraph/include/freetype/ftlcdfil.h new file mode 100644 index 0000000..9a61377 --- /dev/null +++ b/libIGraph/include/freetype/ftlcdfil.h @@ -0,0 +1,166 @@ +/***************************************************************************/ +/* */ +/* ftlcdfil.h */ +/* */ +/* FreeType API for color filtering of subpixel bitmap glyphs */ +/* (specification). */ +/* */ +/* Copyright 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_LCD_FILTER_H__ +#define __FT_LCD_FILTER_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + /*************************************************************************** + * + * @section: + * lcd_filtering + * + * @title: + * LCD Filtering + * + * @abstract: + * Reduce color fringes of LCD-optimized bitmaps. + * + * @description: + * The @FT_Library_SetLcdFilter API can be used to specify a low-pass + * filter which is then applied to LCD-optimized bitmaps generated + * through @FT_Render_Glyph. This is useful to reduce color fringes + * which would occur with unfiltered rendering. + * + * Note that no filter is active by default, and that this function is + * *not* implemented in default builds of the library. You need to + * #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file + * in order to activate it. + */ + + + /**************************************************************************** + * + * @func: + * FT_LcdFilter + * + * @description: + * A list of values to identify various types of LCD filters. + * + * @values: + * FT_LCD_FILTER_NONE :: + * Do not perform filtering. When used with subpixel rendering, this + * results in sometimes severe color fringes. + * + * FT_LCD_FILTER_DEFAULT :: + * The default filter reduces color fringes considerably, at the cost + * of a slight blurriness in the output. + * + * FT_LCD_FILTER_LIGHT :: + * The light filter is a variant that produces less blurriness at the + * cost of slightly more color fringes than the default one. It might + * be better, depending on taste, your monitor, or your personal vision. + * + * FT_LCD_FILTER_LEGACY :: + * This filter corresponds to the original libXft color filter. It + * provides high contrast output but can exhibit really bad color + * fringes if glyphs are not extremely well hinted to the pixel grid. + * In other words, it only works well if the TrueType bytecode + * interpreter is enabled *and* high-quality hinted fonts are used. + * + * This filter is only provided for comparison purposes, and might be + * disabled or stay unsupported in the future. + * + * @since: + * 2.3.0 + */ + typedef enum + { + FT_LCD_FILTER_NONE = 0, + FT_LCD_FILTER_DEFAULT = 1, + FT_LCD_FILTER_LIGHT = 2, + FT_LCD_FILTER_LEGACY = 16, + + FT_LCD_FILTER_MAX /* do not remove */ + + } FT_LcdFilter; + + + /************************************************************************** + * + * @func: + * FT_Library_SetLcdFilter + * + * @description: + * This function is used to apply color filtering to LCD decimated + * bitmaps, like the ones used when calling @FT_Render_Glyph with + * @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V. + * + * @input: + * library :: + * A handle to the target library instance. + * + * filter :: + * The filter type. + * + * You can use @FT_LCD_FILTER_NONE here to disable this feature, or + * @FT_LCD_FILTER_DEFAULT to use a default filter that should work + * well on most LCD screens. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This feature is always disabled by default. Clients must make an + * explicit call to this function with a `filter' value other than + * @FT_LCD_FILTER_NONE in order to enable it. + * + * Due to *PATENTS* covering subpixel rendering, this function doesn't + * do anything except returning `FT_Err_Unimplemented_Feature' if the + * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not + * defined in your build of the library, which should correspond to all + * default builds of FreeType. + * + * The filter affects glyph bitmaps rendered through @FT_Render_Glyph, + * @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char. + * + * It does _not_ affect the output of @FT_Outline_Render and + * @FT_Outline_Get_Bitmap. + * + * If this feature is activated, the dimensions of LCD glyph bitmaps are + * either larger or taller than the dimensions of the corresponding + * outline with regards to the pixel grid. For example, for + * @FT_RENDER_MODE_LCD, the filter adds up to 3 pixels to the left, and + * up to 3 pixels to the right. + * + * The bitmap offset values are adjusted correctly, so clients shouldn't + * need to modify their layout and glyph positioning code when enabling + * the filter. + * + * @since: + * 2.3.0 + */ + FT_EXPORT( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ); + + /* */ + + +FT_END_HEADER + +#endif /* __FT_LCD_FILTER_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftlist.h b/libIGraph/include/freetype/ftlist.h new file mode 100644 index 0000000..f3223ee --- /dev/null +++ b/libIGraph/include/freetype/ftlist.h @@ -0,0 +1,273 @@ +/***************************************************************************/ +/* */ +/* ftlist.h */ +/* */ +/* Generic list support for FreeType (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file implements functions relative to list processing. Its */ + /* data structures are defined in `freetype.h'. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTLIST_H__ +#define __FTLIST_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* list_processing */ + /* */ + /* <Title> */ + /* List Processing */ + /* */ + /* <Abstract> */ + /* Simple management of lists. */ + /* */ + /* <Description> */ + /* This section contains various definitions related to list */ + /* processing using doubly-linked nodes. */ + /* */ + /* <Order> */ + /* FT_List */ + /* FT_ListNode */ + /* FT_ListRec */ + /* FT_ListNodeRec */ + /* */ + /* FT_List_Add */ + /* FT_List_Insert */ + /* FT_List_Find */ + /* FT_List_Remove */ + /* FT_List_Up */ + /* FT_List_Iterate */ + /* FT_List_Iterator */ + /* FT_List_Finalize */ + /* FT_List_Destructor */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Find */ + /* */ + /* <Description> */ + /* Finds the list node for a given listed object. */ + /* */ + /* <Input> */ + /* list :: A pointer to the parent list. */ + /* data :: The address of the listed object. */ + /* */ + /* <Return> */ + /* List node. NULL if it wasn't found. */ + /* */ + FT_EXPORT( FT_ListNode ) + FT_List_Find( FT_List list, + void* data ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Add */ + /* */ + /* <Description> */ + /* Appends an element to the end of a list. */ + /* */ + /* <InOut> */ + /* list :: A pointer to the parent list. */ + /* node :: The node to append. */ + /* */ + FT_EXPORT( void ) + FT_List_Add( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Insert */ + /* */ + /* <Description> */ + /* Inserts an element at the head of a list. */ + /* */ + /* <InOut> */ + /* list :: A pointer to parent list. */ + /* node :: The node to insert. */ + /* */ + FT_EXPORT( void ) + FT_List_Insert( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Remove */ + /* */ + /* <Description> */ + /* Removes a node from a list. This function doesn't check whether */ + /* the node is in the list! */ + /* */ + /* <Input> */ + /* node :: The node to remove. */ + /* */ + /* <InOut> */ + /* list :: A pointer to the parent list. */ + /* */ + FT_EXPORT( void ) + FT_List_Remove( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Up */ + /* */ + /* <Description> */ + /* Moves a node to the head/top of a list. Used to maintain LRU */ + /* lists. */ + /* */ + /* <InOut> */ + /* list :: A pointer to the parent list. */ + /* node :: The node to move. */ + /* */ + FT_EXPORT( void ) + FT_List_Up( FT_List list, + FT_ListNode node ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_List_Iterator */ + /* */ + /* <Description> */ + /* An FT_List iterator function which is called during a list parse */ + /* by @FT_List_Iterate. */ + /* */ + /* <Input> */ + /* node :: The current iteration list node. */ + /* */ + /* user :: A typeless pointer passed to @FT_List_Iterate. */ + /* Can be used to point to the iteration's state. */ + /* */ + typedef FT_Error + (*FT_List_Iterator)( FT_ListNode node, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Iterate */ + /* */ + /* <Description> */ + /* Parses a list and calls a given iterator function on each element. */ + /* Note that parsing is stopped as soon as one of the iterator calls */ + /* returns a non-zero value. */ + /* */ + /* <Input> */ + /* list :: A handle to the list. */ + /* iterator :: An iterator function, called on each node of the list. */ + /* user :: A user-supplied field which is passed as the second */ + /* argument to the iterator. */ + /* */ + /* <Return> */ + /* The result (a FreeType error code) of the last iterator call. */ + /* */ + FT_EXPORT( FT_Error ) + FT_List_Iterate( FT_List list, + FT_List_Iterator iterator, + void* user ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_List_Destructor */ + /* */ + /* <Description> */ + /* An @FT_List iterator function which is called during a list */ + /* finalization by @FT_List_Finalize to destroy all elements in a */ + /* given list. */ + /* */ + /* <Input> */ + /* system :: The current system object. */ + /* */ + /* data :: The current object to destroy. */ + /* */ + /* user :: A typeless pointer passed to @FT_List_Iterate. It can */ + /* be used to point to the iteration's state. */ + /* */ + typedef void + (*FT_List_Destructor)( FT_Memory memory, + void* data, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_List_Finalize */ + /* */ + /* <Description> */ + /* Destroys all elements in the list as well as the list itself. */ + /* */ + /* <Input> */ + /* list :: A handle to the list. */ + /* */ + /* destroy :: A list destructor that will be applied to each element */ + /* of the list. */ + /* */ + /* memory :: The current memory object which handles deallocation. */ + /* */ + /* user :: A user-supplied field which is passed as the last */ + /* argument to the destructor. */ + /* */ + FT_EXPORT( void ) + FT_List_Finalize( FT_List list, + FT_List_Destructor destroy, + FT_Memory memory, + void* user ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTLIST_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftlzw.h b/libIGraph/include/freetype/ftlzw.h new file mode 100644 index 0000000..d950653 --- /dev/null +++ b/libIGraph/include/freetype/ftlzw.h @@ -0,0 +1,99 @@ +/***************************************************************************/ +/* */ +/* ftlzw.h */ +/* */ +/* LZW-compressed stream support. */ +/* */ +/* Copyright 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTLZW_H__ +#define __FTLZW_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* <Section> */ + /* lzw */ + /* */ + /* <Title> */ + /* LZW Streams */ + /* */ + /* <Abstract> */ + /* Using LZW-compressed font files. */ + /* */ + /* <Description> */ + /* This section contains the declaration of LZW-specific functions. */ + /* */ + /*************************************************************************/ + + /************************************************************************ + * + * @function: + * FT_Stream_OpenLZW + * + * @description: + * Open a new stream to parse LZW-compressed font files. This is + * mainly used to support the compressed `*.pcf.Z' fonts that come + * with XFree86. + * + * @input: + * stream :: The target embedding stream. + * + * source :: The source stream. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The source stream must be opened _before_ calling this function. + * + * Calling the internal function `FT_Stream_Close' on the new stream will + * *not* call `FT_Stream_Close' on the source stream. None of the stream + * objects will be released to the heap. + * + * The stream implementation is very basic and resets the decompression + * process each time seeking backwards is needed within the stream + * + * In certain builds of the library, LZW compression recognition is + * automatically handled when calling @FT_New_Face or @FT_Open_Face. + * This means that if no font driver is capable of handling the raw + * compressed file, the library will try to open a LZW stream from it + * and re-open the face with it. + * + * This function may return `FT_Err_Unimplemented_Feature' if your build + * of FreeType was not compiled with LZW support. + */ + FT_EXPORT( FT_Error ) + FT_Stream_OpenLZW( FT_Stream stream, + FT_Stream source ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTLZW_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftmac.h b/libIGraph/include/freetype/ftmac.h new file mode 100644 index 0000000..3c6fafe --- /dev/null +++ b/libIGraph/include/freetype/ftmac.h @@ -0,0 +1,272 @@ +/***************************************************************************/ +/* */ +/* ftmac.h */ +/* */ +/* Additional Mac-specific API. */ +/* */ +/* Copyright 1996-2001, 2004, 2006, 2007 by */ +/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* NOTE: Include this file after <freetype/freetype.h> and after the */ +/* Mac-specific <Types.h> header (or any other Mac header that */ +/* includes <Types.h>); we use Handle type. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMAC_H__ +#define __FTMAC_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + +/* gcc-3.4.1 and later can warn about functions tagged as deprecated */ +#ifndef FT_DEPRECATED_ATTRIBUTE +#if defined(__GNUC__) && \ + ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))) +#define FT_DEPRECATED_ATTRIBUTE __attribute__((deprecated)) +#else +#define FT_DEPRECATED_ATTRIBUTE +#endif +#endif + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* mac_specific */ + /* */ + /* <Title> */ + /* Mac Specific Interface */ + /* */ + /* <Abstract> */ + /* Only available on the Macintosh. */ + /* */ + /* <Description> */ + /* The following definitions are only available if FreeType is */ + /* compiled on a Macintosh. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FOND */ + /* */ + /* <Description> */ + /* Create a new face object from a FOND resource. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* fond :: A FOND resource. */ + /* */ + /* face_index :: Only supported for the -1 `sanity check' special */ + /* case. */ + /* */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Notes> */ + /* This function can be used to create @FT_Face objects from fonts */ + /* that are installed in the system as follows. */ + /* */ + /* { */ + /* fond = GetResource( 'FOND', fontName ); */ + /* error = FT_New_Face_From_FOND( library, fond, 0, &face ); */ + /* } */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FOND( FT_Library library, + Handle fond, + FT_Long face_index, + FT_Face *aface ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GetFile_From_Mac_Name */ + /* */ + /* <Description> */ + /* Return an FSSpec for the disk file containing the named font. */ + /* */ + /* <Input> */ + /* fontName :: Mac OS name of the font (e.g., Times New Roman */ + /* Bold). */ + /* */ + /* <Output> */ + /* pathSpec :: FSSpec to the file. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* face_index :: Index of the face. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GetFile_From_Mac_ATS_Name */ + /* */ + /* <Description> */ + /* Return an FSSpec for the disk file containing the named font. */ + /* */ + /* <Input> */ + /* fontName :: Mac OS name of the font in ATS framework. */ + /* */ + /* <Output> */ + /* pathSpec :: FSSpec to the file. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* face_index :: Index of the face. For passing to */ + /* @FT_New_Face_From_FSSpec. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_GetFilePath_From_Mac_ATS_Name */ + /* */ + /* <Description> */ + /* Return a pathname of the disk file and face index for given font */ + /* name which is handled by ATS framework. */ + /* */ + /* <Input> */ + /* fontName :: Mac OS name of the font in ATS framework. */ + /* */ + /* <Output> */ + /* path :: Buffer to store pathname of the file. For passing */ + /* to @FT_New_Face. The client must allocate this */ + /* buffer before calling this function. */ + /* */ + /* maxPathSize :: Lengths of the buffer `path' that client allocated. */ + /* */ + /* face_index :: Index of the face. For passing to @FT_New_Face. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSSpec */ + /* */ + /* <Description> */ + /* Create a new face object from a given resource and typeface index */ + /* using an FSSpec to the font file. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* spec :: FSSpec to the font file. */ + /* */ + /* face_index :: The index of the face within the resource. The */ + /* first face has index 0. */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* @FT_New_Face_From_FSSpec is identical to @FT_New_Face except */ + /* it accepts an FSSpec instead of a path. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec *spec, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Face_From_FSRef */ + /* */ + /* <Description> */ + /* Create a new face object from a given resource and typeface index */ + /* using an FSRef to the font file. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library resource. */ + /* */ + /* <Input> */ + /* spec :: FSRef to the font file. */ + /* */ + /* face_index :: The index of the face within the resource. The */ + /* first face has index 0. */ + /* <Output> */ + /* aface :: A handle to a new face object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* @FT_New_Face_From_FSRef is identical to @FT_New_Face except */ + /* it accepts an FSRef instead of a path. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Face_From_FSRef( FT_Library library, + const FSRef *ref, + FT_Long face_index, + FT_Face *aface ) + FT_DEPRECATED_ATTRIBUTE; + + /* */ + + +FT_END_HEADER + + +#endif /* __FTMAC_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftmm.h b/libIGraph/include/freetype/ftmm.h new file mode 100644 index 0000000..a9ccfe7 --- /dev/null +++ b/libIGraph/include/freetype/ftmm.h @@ -0,0 +1,378 @@ +/***************************************************************************/ +/* */ +/* ftmm.h */ +/* */ +/* FreeType Multiple Master font interface (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMM_H__ +#define __FTMM_H__ + + +#include <ft2build.h> +#include FT_TYPE1_TABLES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* multiple_masters */ + /* */ + /* <Title> */ + /* Multiple Masters */ + /* */ + /* <Abstract> */ + /* How to manage Multiple Masters fonts. */ + /* */ + /* <Description> */ + /* The following types and functions are used to manage Multiple */ + /* Master fonts, i.e., the selection of specific design instances by */ + /* setting design axis coordinates. */ + /* */ + /* George Williams has extended this interface to make it work with */ + /* both Type 1 Multiple Masters fonts and GX distortable (var) */ + /* fonts. Some of these routines only work with MM fonts, others */ + /* will work with both types. They are similar enough that a */ + /* consistent interface makes sense. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_MM_Axis */ + /* */ + /* <Description> */ + /* A simple structure used to model a given axis in design space for */ + /* Multiple Masters fonts. */ + /* */ + /* This structure can't be used for GX var fonts. */ + /* */ + /* <Fields> */ + /* name :: The axis's name. */ + /* */ + /* minimum :: The axis's minimum design coordinate. */ + /* */ + /* maximum :: The axis's maximum design coordinate. */ + /* */ + typedef struct FT_MM_Axis_ + { + FT_String* name; + FT_Long minimum; + FT_Long maximum; + + } FT_MM_Axis; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Multi_Master */ + /* */ + /* <Description> */ + /* A structure used to model the axes and space of a Multiple Masters */ + /* font. */ + /* */ + /* This structure can't be used for GX var fonts. */ + /* */ + /* <Fields> */ + /* num_axis :: Number of axes. Cannot exceed 4. */ + /* */ + /* num_designs :: Number of designs; should be normally 2^num_axis */ + /* even though the Type 1 specification strangely */ + /* allows for intermediate designs to be present. This */ + /* number cannot exceed 16. */ + /* */ + /* axis :: A table of axis descriptors. */ + /* */ + typedef struct FT_Multi_Master_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_MM_Axis axis[T1_MAX_MM_AXIS]; + + } FT_Multi_Master; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Var_Axis */ + /* */ + /* <Description> */ + /* A simple structure used to model a given axis in design space for */ + /* Multiple Masters and GX var fonts. */ + /* */ + /* <Fields> */ + /* name :: The axis's name. */ + /* Not always meaningful for GX. */ + /* */ + /* minimum :: The axis's minimum design coordinate. */ + /* */ + /* def :: The axis's default design coordinate. */ + /* FreeType computes meaningful default values for MM; it */ + /* is then an integer value, not in 16.16 format. */ + /* */ + /* maximum :: The axis's maximum design coordinate. */ + /* */ + /* tag :: The axis's tag (the GX equivalent to `name'). */ + /* FreeType provides default values for MM if possible. */ + /* */ + /* strid :: The entry in `name' table (another GX version of */ + /* `name'). */ + /* Not meaningful for MM. */ + /* */ + typedef struct FT_Var_Axis_ + { + FT_String* name; + + FT_Fixed minimum; + FT_Fixed def; + FT_Fixed maximum; + + FT_ULong tag; + FT_UInt strid; + + } FT_Var_Axis; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Var_Named_Style */ + /* */ + /* <Description> */ + /* A simple structure used to model a named style in a GX var font. */ + /* */ + /* This structure can't be used for MM fonts. */ + /* */ + /* <Fields> */ + /* coords :: The design coordinates for this style. */ + /* This is an array with one entry for each axis. */ + /* */ + /* strid :: The entry in `name' table identifying this style. */ + /* */ + typedef struct FT_Var_Named_Style_ + { + FT_Fixed* coords; + FT_UInt strid; + + } FT_Var_Named_Style; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_MM_Var */ + /* */ + /* <Description> */ + /* A structure used to model the axes and space of a Multiple Masters */ + /* or GX var distortable font. */ + /* */ + /* Some fields are specific to one format and not to the other. */ + /* */ + /* <Fields> */ + /* num_axis :: The number of axes. The maximum value is 4 for */ + /* MM; no limit in GX. */ + /* */ + /* num_designs :: The number of designs; should be normally */ + /* 2^num_axis for MM fonts. Not meaningful for GX */ + /* (where every glyph could have a different */ + /* number of designs). */ + /* */ + /* num_namedstyles :: The number of named styles; only meaningful for */ + /* GX which allows certain design coordinates to */ + /* have a string ID (in the `name' table) */ + /* associated with them. The font can tell the */ + /* user that, for example, Weight=1.5 is `Bold'. */ + /* */ + /* axis :: A table of axis descriptors. */ + /* GX fonts contain slightly more data than MM. */ + /* */ + /* namedstyles :: A table of named styles. */ + /* Only meaningful with GX. */ + /* */ + typedef struct FT_MM_Var_ + { + FT_UInt num_axis; + FT_UInt num_designs; + FT_UInt num_namedstyles; + FT_Var_Axis* axis; + FT_Var_Named_Style* namedstyle; + + } FT_MM_Var; + + + /* */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Multi_Master */ + /* */ + /* <Description> */ + /* Retrieves the Multiple Master descriptor of a given font. */ + /* */ + /* This function can't be used with GX fonts. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Output> */ + /* amaster :: The Multiple Masters descriptor. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_MM_Var */ + /* */ + /* <Description> */ + /* Retrieves the Multiple Master/GX var descriptor of a given font. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Output> */ + /* amaster :: The Multiple Masters descriptor. */ + /* Allocates a data structure, which the user must free */ + /* (a single call to FT_FREE will do it). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_MM_Var( FT_Face face, + FT_MM_Var* *amaster ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_MM_Design_Coordinates */ + /* */ + /* <Description> */ + /* For Multiple Masters fonts, choose an interpolated font design */ + /* through design coordinates. */ + /* */ + /* This function can't be used with GX fonts. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face. */ + /* */ + /* <Input> */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: An array of design coordinates. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Var_Design_Coordinates */ + /* */ + /* <Description> */ + /* For Multiple Master or GX Var fonts, choose an interpolated font */ + /* design through design coordinates. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face. */ + /* */ + /* <Input> */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: An array of design coordinates. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_MM_Blend_Coordinates */ + /* */ + /* <Description> */ + /* For Multiple Masters and GX var fonts, choose an interpolated font */ + /* design through normalized blend coordinates. */ + /* */ + /* <InOut> */ + /* face :: A handle to the source face. */ + /* */ + /* <Input> */ + /* num_coords :: The number of design coordinates (must be equal to */ + /* the number of axes in the font). */ + /* */ + /* coords :: The design coordinates array (each element must be */ + /* between 0 and 1.0). */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Var_Blend_Coordinates */ + /* */ + /* <Description> */ + /* This is another name of @FT_Set_MM_Blend_Coordinates. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTMM_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftmodapi.h b/libIGraph/include/freetype/ftmodapi.h new file mode 100644 index 0000000..9cc32af --- /dev/null +++ b/libIGraph/include/freetype/ftmodapi.h @@ -0,0 +1,406 @@ +/***************************************************************************/ +/* */ +/* ftmodapi.h */ +/* */ +/* FreeType modules public interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMODAPI_H__ +#define __FTMODAPI_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* module_management */ + /* */ + /* <Title> */ + /* Module Management */ + /* */ + /* <Abstract> */ + /* How to add, upgrade, and remove modules from FreeType. */ + /* */ + /* <Description> */ + /* The definitions below are used to manage modules within FreeType. */ + /* Modules can be added, upgraded, and removed at runtime. */ + /* */ + /*************************************************************************/ + + + /* module bit flags */ +#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */ +#define FT_MODULE_RENDERER 2 /* this module is a renderer */ +#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */ +#define FT_MODULE_STYLER 8 /* this module is a styler */ + +#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */ + /* scalable fonts */ +#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */ + /* support vector outlines */ +#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */ + /* own hinter */ + + + /* deprecated values */ +#define ft_module_font_driver FT_MODULE_FONT_DRIVER +#define ft_module_renderer FT_MODULE_RENDERER +#define ft_module_hinter FT_MODULE_HINTER +#define ft_module_styler FT_MODULE_STYLER + +#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE +#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES +#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER + + + typedef FT_Pointer FT_Module_Interface; + + typedef FT_Error + (*FT_Module_Constructor)( FT_Module module ); + + typedef void + (*FT_Module_Destructor)( FT_Module module ); + + typedef FT_Module_Interface + (*FT_Module_Requester)( FT_Module module, + const char* name ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Module_Class */ + /* */ + /* <Description> */ + /* The module class descriptor. */ + /* */ + /* <Fields> */ + /* module_flags :: Bit flags describing the module. */ + /* */ + /* module_size :: The size of one module object/instance in */ + /* bytes. */ + /* */ + /* module_name :: The name of the module. */ + /* */ + /* module_version :: The version, as a 16.16 fixed number */ + /* (major.minor). */ + /* */ + /* module_requires :: The version of FreeType this module requires, */ + /* as a 16.16 fixed number (major.minor). Starts */ + /* at version 2.0, i.e., 0x20000. */ + /* */ + /* module_init :: A function used to initialize (not create) a */ + /* new module object. */ + /* */ + /* module_done :: A function used to finalize (not destroy) a */ + /* given module object */ + /* */ + /* get_interface :: Queries a given module for a specific */ + /* interface by name. */ + /* */ + typedef struct FT_Module_Class_ + { + FT_ULong module_flags; + FT_Long module_size; + const FT_String* module_name; + FT_Fixed module_version; + FT_Fixed module_requires; + + const void* module_interface; + + FT_Module_Constructor module_init; + FT_Module_Destructor module_done; + FT_Module_Requester get_interface; + + } FT_Module_Class; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Add_Module */ + /* */ + /* <Description> */ + /* Adds a new module to a given library instance. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library object. */ + /* */ + /* <Input> */ + /* clazz :: A pointer to class descriptor for the module. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* An error will be returned if a module already exists by that name, */ + /* or if the module requires a version of FreeType that is too great. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Module */ + /* */ + /* <Description> */ + /* Finds a module by its name. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object. */ + /* */ + /* module_name :: The module's name (as an ASCII string). */ + /* */ + /* <Return> */ + /* A module handle. 0 if none was found. */ + /* */ + /* <Note> */ + /* FreeType's internal modules aren't documented very well, and you */ + /* should look up the source code for details. */ + /* */ + FT_EXPORT( FT_Module ) + FT_Get_Module( FT_Library library, + const char* module_name ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Remove_Module */ + /* */ + /* <Description> */ + /* Removes a given module from a library instance. */ + /* */ + /* <InOut> */ + /* library :: A handle to a library object. */ + /* */ + /* <Input> */ + /* module :: A handle to a module object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The module object is destroyed by the function in case of success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Remove_Module( FT_Library library, + FT_Module module ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Library */ + /* */ + /* <Description> */ + /* This function is used to create a new FreeType library instance */ + /* from a given memory object. It is thus possible to use libraries */ + /* with distinct memory allocators within the same program. */ + /* */ + /* <Input> */ + /* memory :: A handle to the original memory object. */ + /* */ + /* <Output> */ + /* alibrary :: A pointer to handle of a new library object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Library( FT_Memory memory, + FT_Library *alibrary ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Library */ + /* */ + /* <Description> */ + /* Discards a given library object. This closes all drivers and */ + /* discards all resource objects. */ + /* */ + /* <Input> */ + /* library :: A handle to the target library. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_Library( FT_Library library ); + +/* */ + + typedef void + (*FT_DebugHook_Func)( void* arg ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Debug_Hook */ + /* */ + /* <Description> */ + /* Sets a debug hook function for debugging the interpreter of a font */ + /* format. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library object. */ + /* */ + /* <Input> */ + /* hook_index :: The index of the debug hook. You should use the */ + /* values defined in `ftobjs.h', e.g., */ + /* `FT_DEBUG_HOOK_TRUETYPE'. */ + /* */ + /* debug_hook :: The function used to debug the interpreter. */ + /* */ + /* <Note> */ + /* Currently, four debug hook slots are available, but only two (for */ + /* the TrueType and the Type 1 interpreter) are defined. */ + /* */ + /* Since the internal headers of FreeType are no longer installed, */ + /* the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly. */ + /* This is a bug and will be fixed in a forthcoming release. */ + /* */ + FT_EXPORT( void ) + FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Add_Default_Modules */ + /* */ + /* <Description> */ + /* Adds the set of default drivers to a given library object. */ + /* This is only useful when you create a library object with */ + /* @FT_New_Library (usually to plug a custom memory manager). */ + /* */ + /* <InOut> */ + /* library :: A handle to a new library object. */ + /* */ + FT_EXPORT( void ) + FT_Add_Default_Modules( FT_Library library ); + + + + /************************************************************************** + * + * @section: + * truetype_engine + * + * @title: + * The TrueType Engine + * + * @abstract: + * TrueType bytecode support. + * + * @description: + * This section contains a function used to query the level of TrueType + * bytecode support compiled in this version of the library. + * + */ + + + /************************************************************************** + * + * @enum: + * FT_TrueTypeEngineType + * + * @description: + * A list of values describing which kind of TrueType bytecode + * engine is implemented in a given FT_Library instance. It is used + * by the @FT_Get_TrueType_Engine_Type function. + * + * @values: + * FT_TRUETYPE_ENGINE_TYPE_NONE :: + * The library doesn't implement any kind of bytecode interpreter. + * + * FT_TRUETYPE_ENGINE_TYPE_UNPATENTED :: + * The library implements a bytecode interpreter that doesn't + * support the patented operations of the TrueType virtual machine. + * + * Its main use is to load certain Asian fonts which position and + * scale glyph components with bytecode instructions. It produces + * bad output for most other fonts. + * + * FT_TRUETYPE_ENGINE_TYPE_PATENTED :: + * The library implements a bytecode interpreter that covers + * the full instruction set of the TrueType virtual machine. + * See the file `docs/PATENTS' for legal aspects. + * + * @since: + * 2.2 + * + */ + typedef enum + { + FT_TRUETYPE_ENGINE_TYPE_NONE = 0, + FT_TRUETYPE_ENGINE_TYPE_UNPATENTED, + FT_TRUETYPE_ENGINE_TYPE_PATENTED + + } FT_TrueTypeEngineType; + + + /************************************************************************** + * + * @func: + * FT_Get_TrueType_Engine_Type + * + * @description: + * Return a @FT_TrueTypeEngineType value to indicate which level of + * the TrueType virtual machine a given library instance supports. + * + * @input: + * library :: + * A library instance. + * + * @return: + * A value indicating which level is supported. + * + * @since: + * 2.2 + * + */ + FT_EXPORT( FT_TrueTypeEngineType ) + FT_Get_TrueType_Engine_Type( FT_Library library ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTMODAPI_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftmoderr.h b/libIGraph/include/freetype/ftmoderr.h new file mode 100644 index 0000000..b0115dd --- /dev/null +++ b/libIGraph/include/freetype/ftmoderr.h @@ -0,0 +1,155 @@ +/***************************************************************************/ +/* */ +/* ftmoderr.h */ +/* */ +/* FreeType module error offsets (specification). */ +/* */ +/* Copyright 2001, 2002, 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is used to define the FreeType module error offsets. */ + /* */ + /* The lower byte gives the error code, the higher byte gives the */ + /* module. The base module has error offset 0. For example, the error */ + /* `FT_Err_Invalid_File_Format' has value 0x003, the error */ + /* `TT_Err_Invalid_File_Format' has value 0x1103, the error */ + /* `T1_Err_Invalid_File_Format' has value 0x1203, etc. */ + /* */ + /* Undefine the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in ftoption.h */ + /* to make the higher byte always zero (disabling the module error */ + /* mechanism). */ + /* */ + /* It can also be used to create a module error message table easily */ + /* with something like */ + /* */ + /* { */ + /* #undef __FTMODERR_H__ */ + /* #define FT_MODERRDEF( e, v, s ) { FT_Mod_Err_ ## e, s }, */ + /* #define FT_MODERR_START_LIST { */ + /* #define FT_MODERR_END_LIST { 0, 0 } }; */ + /* */ + /* const struct */ + /* { */ + /* int mod_err_offset; */ + /* const char* mod_err_msg */ + /* } ft_mod_errors[] = */ + /* */ + /* #include FT_MODULE_ERRORS_H */ + /* } */ + /* */ + /* To use such a table, all errors must be ANDed with 0xFF00 to remove */ + /* the error code. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTMODERR_H__ +#define __FTMODERR_H__ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** SETUP MACROS *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#undef FT_NEED_EXTERN_C + +#ifndef FT_MODERRDEF + +#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = v, +#else +#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = 0, +#endif + +#define FT_MODERR_START_LIST enum { +#define FT_MODERR_END_LIST FT_Mod_Err_Max }; + +#ifdef __cplusplus +#define FT_NEED_EXTERN_C + extern "C" { +#endif + +#endif /* !FT_MODERRDEF */ + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** LIST MODULE ERROR BASES *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_MODERR_START_LIST + FT_MODERR_START_LIST +#endif + + + FT_MODERRDEF( Base, 0x000, "base module" ) + FT_MODERRDEF( Autofit, 0x100, "autofitter module" ) + FT_MODERRDEF( BDF, 0x200, "BDF module" ) + FT_MODERRDEF( Cache, 0x300, "cache module" ) + FT_MODERRDEF( CFF, 0x400, "CFF module" ) + FT_MODERRDEF( CID, 0x500, "CID module" ) + FT_MODERRDEF( Gzip, 0x600, "Gzip module" ) + FT_MODERRDEF( LZW, 0x700, "LZW module" ) + FT_MODERRDEF( OTvalid, 0x800, "OpenType validation module" ) + FT_MODERRDEF( PCF, 0x900, "PCF module" ) + FT_MODERRDEF( PFR, 0xA00, "PFR module" ) + FT_MODERRDEF( PSaux, 0xB00, "PS auxiliary module" ) + FT_MODERRDEF( PShinter, 0xC00, "PS hinter module" ) + FT_MODERRDEF( PSnames, 0xD00, "PS names module" ) + FT_MODERRDEF( Raster, 0xE00, "raster module" ) + FT_MODERRDEF( SFNT, 0xF00, "SFNT module" ) + FT_MODERRDEF( Smooth, 0x1000, "smooth raster module" ) + FT_MODERRDEF( TrueType, 0x1100, "TrueType module" ) + FT_MODERRDEF( Type1, 0x1200, "Type 1 module" ) + FT_MODERRDEF( Type42, 0x1300, "Type 42 module" ) + FT_MODERRDEF( Winfonts, 0x1400, "Windows FON/FNT module" ) + + +#ifdef FT_MODERR_END_LIST + FT_MODERR_END_LIST +#endif + + + /*******************************************************************/ + /*******************************************************************/ + /***** *****/ + /***** CLEANUP *****/ + /***** *****/ + /*******************************************************************/ + /*******************************************************************/ + + +#ifdef FT_NEED_EXTERN_C + } +#endif + +#undef FT_MODERR_START_LIST +#undef FT_MODERR_END_LIST +#undef FT_MODERRDEF +#undef FT_NEED_EXTERN_C + + +#endif /* __FTMODERR_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftotval.h b/libIGraph/include/freetype/ftotval.h new file mode 100644 index 0000000..7c488fd --- /dev/null +++ b/libIGraph/include/freetype/ftotval.h @@ -0,0 +1,198 @@ +/***************************************************************************/ +/* */ +/* ftotval.h */ +/* */ +/* FreeType API for validating OpenType tables (specification). */ +/* */ +/* Copyright 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +/***************************************************************************/ +/* */ +/* */ +/* Warning: This module might be moved to a different library in the */ +/* future to avoid a tight dependency between FreeType and the */ +/* OpenType specification. */ +/* */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOTVAL_H__ +#define __FTOTVAL_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* ot_validation */ + /* */ + /* <Title> */ + /* OpenType Validation */ + /* */ + /* <Abstract> */ + /* An API to validate OpenType tables. */ + /* */ + /* <Description> */ + /* This section contains the declaration of functions to validate */ + /* some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF). */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @enum: + * FT_VALIDATE_OTXXX + * + * @description: + * A list of bit-field constants used with @FT_OpenType_Validate to + * indicate which OpenType tables should be validated. + * + * @values: + * FT_VALIDATE_BASE :: + * Validate BASE table. + * + * FT_VALIDATE_GDEF :: + * Validate GDEF table. + * + * FT_VALIDATE_GPOS :: + * Validate GPOS table. + * + * FT_VALIDATE_GSUB :: + * Validate GSUB table. + * + * FT_VALIDATE_JSTF :: + * Validate JSTF table. + * + * FT_VALIDATE_OT :: + * Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF). + * + */ +#define FT_VALIDATE_BASE 0x0100 +#define FT_VALIDATE_GDEF 0x0200 +#define FT_VALIDATE_GPOS 0x0400 +#define FT_VALIDATE_GSUB 0x0800 +#define FT_VALIDATE_JSTF 0x1000 + +#define FT_VALIDATE_OT FT_VALIDATE_BASE | \ + FT_VALIDATE_GDEF | \ + FT_VALIDATE_GPOS | \ + FT_VALIDATE_GSUB | \ + FT_VALIDATE_JSTF + + /* */ + + /********************************************************************** + * + * @function: + * FT_OpenType_Validate + * + * @description: + * Validate various OpenType tables to assure that all offsets and + * indices are valid. The idea is that a higher-level library which + * actually does the text layout can access those tables without + * error checking (which can be quite time consuming). + * + * @input: + * face :: + * A handle to the input face. + * + * validation_flags :: + * A bit field which specifies the tables to be validated. See + * @FT_VALIDATE_OTXXX for possible values. + * + * @output: + * BASE_table :: + * A pointer to the BASE table. + * + * GDEF_table :: + * A pointer to the GDEF table. + * + * GPOS_table :: + * A pointer to the GPOS table. + * + * GSUB_table :: + * A pointer to the GSUB table. + * + * JSTF_table :: + * A pointer to the JSTF table. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function only works with OpenType fonts, returning an error + * otherwise. + * + * After use, the application should deallocate the five tables with + * @FT_OpenType_Free. A NULL value indicates that the table either + * doesn't exist in the font, or the application hasn't asked for + * validation. + */ + FT_EXPORT( FT_Error ) + FT_OpenType_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *BASE_table, + FT_Bytes *GDEF_table, + FT_Bytes *GPOS_table, + FT_Bytes *GSUB_table, + FT_Bytes *JSTF_table ); + + /* */ + + /********************************************************************** + * + * @function: + * FT_OpenType_Free + * + * @description: + * Free the buffer allocated by OpenType validator. + * + * @input: + * face :: + * A handle to the input face. + * + * table :: + * The pointer to the buffer that is allocated by + * @FT_OpenType_Validate. + * + * @note: + * This function must be used to free the buffer allocated by + * @FT_OpenType_Validate only. + */ + FT_EXPORT( void ) + FT_OpenType_Free( FT_Face face, + FT_Bytes table ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTOTVAL_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftoutln.h b/libIGraph/include/freetype/ftoutln.h new file mode 100644 index 0000000..786ae13 --- /dev/null +++ b/libIGraph/include/freetype/ftoutln.h @@ -0,0 +1,526 @@ +/***************************************************************************/ +/* */ +/* ftoutln.h */ +/* */ +/* Support for the FT_Outline type used to store glyph shapes of */ +/* most scalable font formats (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTOUTLN_H__ +#define __FTOUTLN_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* outline_processing */ + /* */ + /* <Title> */ + /* Outline Processing */ + /* */ + /* <Abstract> */ + /* Functions to create, transform, and render vectorial glyph images. */ + /* */ + /* <Description> */ + /* This section contains routines used to create and destroy scalable */ + /* glyph images known as `outlines'. These can also be measured, */ + /* transformed, and converted into bitmaps and pixmaps. */ + /* */ + /* <Order> */ + /* FT_Outline */ + /* FT_OUTLINE_FLAGS */ + /* FT_Outline_New */ + /* FT_Outline_Done */ + /* FT_Outline_Copy */ + /* FT_Outline_Translate */ + /* FT_Outline_Transform */ + /* FT_Outline_Embolden */ + /* FT_Outline_Reverse */ + /* FT_Outline_Check */ + /* */ + /* FT_Outline_Get_CBox */ + /* FT_Outline_Get_BBox */ + /* */ + /* FT_Outline_Get_Bitmap */ + /* FT_Outline_Render */ + /* */ + /* FT_Outline_Decompose */ + /* FT_Outline_Funcs */ + /* FT_Outline_MoveTo_Func */ + /* FT_Outline_LineTo_Func */ + /* FT_Outline_ConicTo_Func */ + /* FT_Outline_CubicTo_Func */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Decompose */ + /* */ + /* <Description> */ + /* Walks over an outline's structure to decompose it into individual */ + /* segments and Bézier arcs. This function is also able to emit */ + /* `move to' and `close to' operations to indicate the start and end */ + /* of new contours in the outline. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source target. */ + /* */ + /* func_interface :: A table of `emitters', i.e,. function pointers */ + /* called during decomposition to indicate path */ + /* operations. */ + /* */ + /* <InOut> */ + /* user :: A typeless pointer which is passed to each */ + /* emitter during the decomposition. It can be */ + /* used to store the state during the */ + /* decomposition. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_New */ + /* */ + /* <Description> */ + /* Creates a new outline of a given size. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object from where the */ + /* outline is allocated. Note however that the new */ + /* outline will *not* necessarily be *freed*, when */ + /* destroying the library, by @FT_Done_FreeType. */ + /* */ + /* numPoints :: The maximal number of points within the outline. */ + /* */ + /* numContours :: The maximal number of contours within the outline. */ + /* */ + /* <Output> */ + /* anoutline :: A handle to the new outline. NULL in case of */ + /* error. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The reason why this function takes a `library' parameter is simply */ + /* to use the library's memory allocator. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_New( FT_Library library, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ); + + + FT_EXPORT( FT_Error ) + FT_Outline_New_Internal( FT_Memory memory, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Done */ + /* */ + /* <Description> */ + /* Destroys an outline created with @FT_Outline_New. */ + /* */ + /* <Input> */ + /* library :: A handle of the library object used to allocate the */ + /* outline. */ + /* */ + /* outline :: A pointer to the outline object to be discarded. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* If the outline's `owner' field is not set, only the outline */ + /* descriptor will be released. */ + /* */ + /* The reason why this function takes an `library' parameter is */ + /* simply to use ft_mem_free(). */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Done( FT_Library library, + FT_Outline* outline ); + + + FT_EXPORT( FT_Error ) + FT_Outline_Done_Internal( FT_Memory memory, + FT_Outline* outline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Check */ + /* */ + /* <Description> */ + /* Check the contents of an outline descriptor. */ + /* */ + /* <Input> */ + /* outline :: A handle to a source outline. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Check( FT_Outline* outline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Get_CBox */ + /* */ + /* <Description> */ + /* Returns an outline's `control box'. The control box encloses all */ + /* the outline's points, including Bézier control points. Though it */ + /* coincides with the exact bounding box for most glyphs, it can be */ + /* slightly larger in some situations (like when rotating an outline */ + /* which contains Bézier outside arcs). */ + /* */ + /* Computing the control box is very fast, while getting the bounding */ + /* box can take much more time as it needs to walk over all segments */ + /* and arcs in the outline. To get the latter, you can use the */ + /* `ftbbox' component which is dedicated to this single task. */ + /* */ + /* <Input> */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* <Output> */ + /* acbox :: The outline's control box. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Translate */ + /* */ + /* <Description> */ + /* Applies a simple translation to the points of an outline. */ + /* */ + /* <InOut> */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* <Input> */ + /* xOffset :: The horizontal offset. */ + /* */ + /* yOffset :: The vertical offset. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Translate( const FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Copy */ + /* */ + /* <Description> */ + /* Copies an outline into another one. Both objects must have the */ + /* same sizes (number of points & number of contours) when this */ + /* function is called. */ + /* */ + /* <Input> */ + /* source :: A handle to the source outline. */ + /* */ + /* <Output> */ + /* target :: A handle to the target outline. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Copy( const FT_Outline* source, + FT_Outline *target ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Transform */ + /* */ + /* <Description> */ + /* Applies a simple 2x2 matrix to all of an outline's points. Useful */ + /* for applying rotations, slanting, flipping, etc. */ + /* */ + /* <InOut> */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* <Input> */ + /* matrix :: A pointer to the transformation matrix. */ + /* */ + /* <Note> */ + /* You can use @FT_Outline_Translate if you need to translate the */ + /* outline's points. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Transform( const FT_Outline* outline, + const FT_Matrix* matrix ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Embolden */ + /* */ + /* <Description> */ + /* Emboldens an outline. The new outline will be at most 4 times */ + /* `strength' pixels wider and higher. You may think of the left and */ + /* bottom borders as unchanged. */ + /* */ + /* Negative `strength' values to reduce the outline thickness are */ + /* possible also. */ + /* */ + /* <InOut> */ + /* outline :: A handle to the target outline. */ + /* */ + /* <Input> */ + /* strength :: How strong the glyph is emboldened. Expressed in */ + /* 26.6 pixel format. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The used algorithm to increase or decrease the thickness of the */ + /* glyph doesn't change the number of points; this means that certain */ + /* situations like acute angles or intersections are sometimes */ + /* handled incorrectly. */ + /* */ + /* Example call: */ + /* */ + /* { */ + /* FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); */ + /* if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE ) */ + /* FT_Outline_Embolden( &face->slot->outline, strength ); */ + /* } */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Embolden( FT_Outline* outline, + FT_Pos strength ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Reverse */ + /* */ + /* <Description> */ + /* Reverses the drawing direction of an outline. This is used to */ + /* ensure consistent fill conventions for mirrored glyphs. */ + /* */ + /* <InOut> */ + /* outline :: A pointer to the target outline descriptor. */ + /* */ + /* <Note> */ + /* This functions toggles the bit flag @FT_OUTLINE_REVERSE_FILL in */ + /* the outline's `flags' field. */ + /* */ + /* It shouldn't be used by a normal client application, unless it */ + /* knows what it is doing. */ + /* */ + FT_EXPORT( void ) + FT_Outline_Reverse( FT_Outline* outline ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Get_Bitmap */ + /* */ + /* <Description> */ + /* Renders an outline within a bitmap. The outline's image is simply */ + /* OR-ed to the target bitmap. */ + /* */ + /* <Input> */ + /* library :: A handle to a FreeType library object. */ + /* */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* <InOut> */ + /* abitmap :: A pointer to the target bitmap descriptor. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function does NOT CREATE the bitmap, it only renders an */ + /* outline image within the one you pass to it! */ + /* */ + /* It will use the raster corresponding to the default glyph format. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Outline_Render */ + /* */ + /* <Description> */ + /* Renders an outline within a bitmap using the current scan-convert. */ + /* This functions uses an @FT_Raster_Params structure as an argument, */ + /* allowing advanced features like direct composition, translucency, */ + /* etc. */ + /* */ + /* <Input> */ + /* library :: A handle to a FreeType library object. */ + /* */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* <InOut> */ + /* params :: A pointer to an @FT_Raster_Params structure used to */ + /* describe the rendering operation. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* You should know what you are doing and how @FT_Raster_Params works */ + /* to use this function. */ + /* */ + /* The field `params.source' will be set to `outline' before the scan */ + /* converter is called, which means that the value you give to it is */ + /* actually ignored. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Outline_Render( FT_Library library, + FT_Outline* outline, + FT_Raster_Params* params ); + + + /************************************************************************** + * + * @enum: + * FT_Orientation + * + * @description: + * A list of values used to describe an outline's contour orientation. + * + * The TrueType and Postscript specifications use different conventions + * to determine whether outline contours should be filled or unfilled. + * + * @values: + * FT_ORIENTATION_TRUETYPE :: + * According to the TrueType specification, clockwise contours must + * be filled, and counter-clockwise ones must be unfilled. + * + * FT_ORIENTATION_POSTSCRIPT :: + * According to the Postscript specification, counter-clockwise contours + * must be filled, and clockwise ones must be unfilled. + * + * FT_ORIENTATION_FILL_RIGHT :: + * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to + * remember that in TrueType, everything that is to the right of + * the drawing direction of a contour must be filled. + * + * FT_ORIENTATION_FILL_LEFT :: + * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to + * remember that in Postscript, everything that is to the left of + * the drawing direction of a contour must be filled. + * + * FT_ORIENTATION_NONE :: + * The orientation cannot be determined. That is, different parts of + * the glyph have different orientation. + * + */ + typedef enum + { + FT_ORIENTATION_TRUETYPE = 0, + FT_ORIENTATION_POSTSCRIPT = 1, + FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE, + FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT, + FT_ORIENTATION_NONE + + } FT_Orientation; + + + /************************************************************************** + * + * @function: + * FT_Outline_Get_Orientation + * + * @description: + * This function analyzes a glyph outline and tries to compute its + * fill orientation (see @FT_Orientation). This is done by computing + * the direction of each global horizontal and/or vertical extrema + * within the outline. + * + * Note that this will return @FT_ORIENTATION_TRUETYPE for empty + * outlines. + * + * @input: + * outline :: + * A handle to the source outline. + * + * @return: + * The orientation. + * + */ + FT_EXPORT( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTOUTLN_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/libIGraph/include/freetype/ftpfr.h b/libIGraph/include/freetype/ftpfr.h new file mode 100644 index 0000000..e2801fd --- /dev/null +++ b/libIGraph/include/freetype/ftpfr.h @@ -0,0 +1,172 @@ +/***************************************************************************/ +/* */ +/* ftpfr.h */ +/* */ +/* FreeType API for accessing PFR-specific data (specification only). */ +/* */ +/* Copyright 2002, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTPFR_H__ +#define __FTPFR_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* pfr_fonts */ + /* */ + /* <Title> */ + /* PFR Fonts */ + /* */ + /* <Abstract> */ + /* PFR/TrueDoc specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of PFR-specific functions. */ + /* */ + /*************************************************************************/ + + + /********************************************************************** + * + * @function: + * FT_Get_PFR_Metrics + * + * @description: + * Return the outline and metrics resolutions of a given PFR face. + * + * @input: + * face :: Handle to the input face. It can be a non-PFR face. + * + * @output: + * aoutline_resolution :: + * Outline resolution. This is equivalent to `face->units_per_EM'. + * Optional (parameter can be NULL). + * + * ametrics_resolution :: + * Metrics resolution. This is equivalent to `outline_resolution' + * for non-PFR fonts. Optional (parameter can be NULL). + * + * ametrics_x_scale :: + * A 16.16 fixed-point number used to scale distance expressed + * in metrics units to device sub-pixels. This is equivalent to + * `face->size->x_scale', but for metrics only. Optional (parameter + * can be NULL) + * + * ametrics_y_scale :: + * Same as `ametrics_x_scale' but for the vertical direction. + * optional (parameter can be NULL) + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * If the input face is not a PFR, this function will return an error. + * However, in all cases, it will return valid values. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Metrics( FT_Face face, + FT_UInt *aoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ); + + + /********************************************************************** + * + * @function: + * FT_Get_PFR_Kerning + * + * @description: + * Return the kerning pair corresponding to two glyphs in a PFR face. + * The distance is expressed in metrics units, unlike the result of + * @FT_Get_Kerning. + * + * @input: + * face :: A handle to the input face. + * + * left :: Index of the left glyph. + * + * right :: Index of the right glyph. + * + * @output: + * avector :: A kerning vector. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function always return distances in original PFR metrics + * units. This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED + * mode, which always returns distances converted to outline units. + * + * You can use the value of the `x_scale' and `y_scale' parameters + * returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels. + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Kerning( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + + /********************************************************************** + * + * @function: + * FT_Get_PFR_Advance + * + * @description: + * Return a given glyph advance, expressed in original metrics units, + * from a PFR font. + * + * @input: + * face :: A handle to the input face. + * + * gindex :: The glyph index. + * + * @output: + * aadvance :: The glyph advance in metrics units. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics + * to convert the advance to device sub-pixels (i.e., 1/64th of pixels). + */ + FT_EXPORT( FT_Error ) + FT_Get_PFR_Advance( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTPFR_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftrender.h b/libIGraph/include/freetype/ftrender.h new file mode 100644 index 0000000..5b07f08 --- /dev/null +++ b/libIGraph/include/freetype/ftrender.h @@ -0,0 +1,229 @@ +/***************************************************************************/ +/* */ +/* ftrender.h */ +/* */ +/* FreeType renderer modules public interface (specification). */ +/* */ +/* Copyright 1996-2001, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTRENDER_H__ +#define __FTRENDER_H__ + + +#include <ft2build.h> +#include FT_MODULE_H +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* module_management */ + /* */ + /*************************************************************************/ + + + /* create a new glyph object */ + typedef FT_Error + (*FT_Glyph_InitFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + + /* destroys a given glyph object */ + typedef void + (*FT_Glyph_DoneFunc)( FT_Glyph glyph ); + + typedef void + (*FT_Glyph_TransformFunc)( FT_Glyph glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + typedef void + (*FT_Glyph_GetBBoxFunc)( FT_Glyph glyph, + FT_BBox* abbox ); + + typedef FT_Error + (*FT_Glyph_CopyFunc)( FT_Glyph source, + FT_Glyph target ); + + typedef FT_Error + (*FT_Glyph_PrepareFunc)( FT_Glyph glyph, + FT_GlyphSlot slot ); + +/* deprecated */ +#define FT_Glyph_Init_Func FT_Glyph_InitFunc +#define FT_Glyph_Done_Func FT_Glyph_DoneFunc +#define FT_Glyph_Transform_Func FT_Glyph_TransformFunc +#define FT_Glyph_BBox_Func FT_Glyph_GetBBoxFunc +#define FT_Glyph_Copy_Func FT_Glyph_CopyFunc +#define FT_Glyph_Prepare_Func FT_Glyph_PrepareFunc + + + struct FT_Glyph_Class_ + { + FT_Long glyph_size; + FT_Glyph_Format glyph_format; + FT_Glyph_InitFunc glyph_init; + FT_Glyph_DoneFunc glyph_done; + FT_Glyph_CopyFunc glyph_copy; + FT_Glyph_TransformFunc glyph_transform; + FT_Glyph_GetBBoxFunc glyph_bbox; + FT_Glyph_PrepareFunc glyph_prepare; + }; + + + typedef FT_Error + (*FT_Renderer_RenderFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_UInt mode, + const FT_Vector* origin ); + + typedef FT_Error + (*FT_Renderer_TransformFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ); + + + typedef void + (*FT_Renderer_GetCBoxFunc)( FT_Renderer renderer, + FT_GlyphSlot slot, + FT_BBox* cbox ); + + + typedef FT_Error + (*FT_Renderer_SetModeFunc)( FT_Renderer renderer, + FT_ULong mode_tag, + FT_Pointer mode_ptr ); + +/* deprecated identifiers */ +#define FTRenderer_render FT_Renderer_RenderFunc +#define FTRenderer_transform FT_Renderer_TransformFunc +#define FTRenderer_getCBox FT_Renderer_GetCBoxFunc +#define FTRenderer_setMode FT_Renderer_SetModeFunc + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Renderer_Class */ + /* */ + /* <Description> */ + /* The renderer module class descriptor. */ + /* */ + /* <Fields> */ + /* root :: The root @FT_Module_Class fields. */ + /* */ + /* glyph_format :: The glyph image format this renderer handles. */ + /* */ + /* render_glyph :: A method used to render the image that is in a */ + /* given glyph slot into a bitmap. */ + /* */ + /* set_mode :: A method used to pass additional parameters. */ + /* */ + /* raster_class :: For @FT_GLYPH_FORMAT_OUTLINE renderers only. This */ + /* is a pointer to its raster's class. */ + /* */ + /* raster :: For @FT_GLYPH_FORMAT_OUTLINE renderers only. This */ + /* is a pointer to the corresponding raster object, */ + /* if any. */ + /* */ + typedef struct FT_Renderer_Class_ + { + FT_Module_Class root; + + FT_Glyph_Format glyph_format; + + FT_Renderer_RenderFunc render_glyph; + FT_Renderer_TransformFunc transform_glyph; + FT_Renderer_GetCBoxFunc get_glyph_cbox; + FT_Renderer_SetModeFunc set_mode; + + FT_Raster_Funcs* raster_class; + + } FT_Renderer_Class; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Renderer */ + /* */ + /* <Description> */ + /* Retrieves the current renderer for a given glyph format. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object. */ + /* */ + /* format :: The glyph format. */ + /* */ + /* <Return> */ + /* A renderer handle. 0 if none found. */ + /* */ + /* <Note> */ + /* An error will be returned if a module already exists by that name, */ + /* or if the module requires a version of FreeType that is too great. */ + /* */ + /* To add a new renderer, simply use @FT_Add_Module. To retrieve a */ + /* renderer by its name, use @FT_Get_Module. */ + /* */ + FT_EXPORT( FT_Renderer ) + FT_Get_Renderer( FT_Library library, + FT_Glyph_Format format ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Set_Renderer */ + /* */ + /* <Description> */ + /* Sets the current renderer to use, and set additional mode. */ + /* */ + /* <InOut> */ + /* library :: A handle to the library object. */ + /* */ + /* <Input> */ + /* renderer :: A handle to the renderer object. */ + /* */ + /* num_params :: The number of additional parameters. */ + /* */ + /* parameters :: Additional parameters. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* In case of success, the renderer will be used to convert glyph */ + /* images in the renderer's known format into bitmaps. */ + /* */ + /* This doesn't change the current renderer for other formats. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Set_Renderer( FT_Library library, + FT_Renderer renderer, + FT_UInt num_params, + FT_Parameter* parameters ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FTRENDER_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftsizes.h b/libIGraph/include/freetype/ftsizes.h new file mode 100644 index 0000000..622df16 --- /dev/null +++ b/libIGraph/include/freetype/ftsizes.h @@ -0,0 +1,159 @@ +/***************************************************************************/ +/* */ +/* ftsizes.h */ +/* */ +/* FreeType size objects management (specification). */ +/* */ +/* Copyright 1996-2001, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Typical application would normally not need to use these functions. */ + /* However, they have been placed in a public API for the rare cases */ + /* where they are needed. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTSIZES_H__ +#define __FTSIZES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* sizes_management */ + /* */ + /* <Title> */ + /* Size Management */ + /* */ + /* <Abstract> */ + /* Managing multiple sizes per face. */ + /* */ + /* <Description> */ + /* When creating a new face object (e.g., with @FT_New_Face), an */ + /* @FT_Size object is automatically created and used to store all */ + /* pixel-size dependent information, available in the `face->size' */ + /* field. */ + /* */ + /* It is however possible to create more sizes for a given face, */ + /* mostly in order to manage several character pixel sizes of the */ + /* same font family and style. See @FT_New_Size and @FT_Done_Size. */ + /* */ + /* Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only */ + /* modify the contents of the current `active' size; you thus need */ + /* to use @FT_Activate_Size to change it. */ + /* */ + /* 99% of applications won't need the functions provided here, */ + /* especially if they use the caching sub-system, so be cautious */ + /* when using these. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Size */ + /* */ + /* <Description> */ + /* Create a new size object from a given face object. */ + /* */ + /* <Input> */ + /* face :: A handle to a parent face object. */ + /* */ + /* <Output> */ + /* asize :: A handle to a new size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* You need to call @FT_Activate_Size in order to select the new size */ + /* for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size, */ + /* @FT_Load_Glyph, @FT_Load_Char, etc. */ + /* */ + FT_EXPORT( FT_Error ) + FT_New_Size( FT_Face face, + FT_Size* size ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Size */ + /* */ + /* <Description> */ + /* Discard a given size object. Note that @FT_Done_Face */ + /* automatically discards all size objects allocated with */ + /* @FT_New_Size. */ + /* */ + /* <Input> */ + /* size :: A handle to a target size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Done_Size( FT_Size size ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Activate_Size */ + /* */ + /* <Description> */ + /* Even though it is possible to create several size objects for a */ + /* given face (see @FT_New_Size for details), functions like */ + /* @FT_Load_Glyph or @FT_Load_Char only use the last-created one to */ + /* determine the `current character pixel size'. */ + /* */ + /* This function can be used to `activate' a previously created size */ + /* object. */ + /* */ + /* <Input> */ + /* size :: A handle to a target size object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* If `face' is the size's parent face object, this function changes */ + /* the value of `face->size' to the input size handle. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Activate_Size( FT_Size size ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTSIZES_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftsnames.h b/libIGraph/include/freetype/ftsnames.h new file mode 100644 index 0000000..003cbcd --- /dev/null +++ b/libIGraph/include/freetype/ftsnames.h @@ -0,0 +1,170 @@ +/***************************************************************************/ +/* */ +/* ftsnames.h */ +/* */ +/* Simple interface to access SFNT name tables (which are used */ +/* to hold font names, copyright info, notices, etc.) (specification). */ +/* */ +/* This is _not_ used to retrieve glyph names! */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_SFNT_NAMES_H__ +#define __FT_SFNT_NAMES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* sfnt_names */ + /* */ + /* <Title> */ + /* SFNT Names */ + /* */ + /* <Abstract> */ + /* Access the names embedded in TrueType and OpenType files. */ + /* */ + /* <Description> */ + /* The TrueType and OpenType specification allow the inclusion of */ + /* a special `names table' in font files. This table contains */ + /* textual (and internationalized) information regarding the font, */ + /* like family name, copyright, version, etc. */ + /* */ + /* The definitions below are used to access them if available. */ + /* */ + /* Note that this has nothing to do with glyph names! */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_SfntName */ + /* */ + /* <Description> */ + /* A structure used to model an SFNT `name' table entry. */ + /* */ + /* <Fields> */ + /* platform_id :: The platform ID for `string'. */ + /* */ + /* encoding_id :: The encoding ID for `string'. */ + /* */ + /* language_id :: The language ID for `string'. */ + /* */ + /* name_id :: An identifier for `string'. */ + /* */ + /* string :: The `name' string. Note that its format differs */ + /* depending on the (platform,encoding) pair. It can */ + /* be a Pascal String, a UTF-16 one, etc. */ + /* */ + /* Generally speaking, the string is not */ + /* zero-terminated. Please refer to the TrueType */ + /* specification for details. */ + /* */ + /* string_len :: The length of `string' in bytes. */ + /* */ + /* <Note> */ + /* Possible values for `platform_id', `encoding_id', `language_id', */ + /* and `name_id' are given in the file `ttnameid.h'. For details */ + /* please refer to the TrueType or OpenType specification. */ + /* */ + /* See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, */ + /* @TT_ISO_ID_XXX, and @TT_MS_ID_XXX. */ + /* */ + typedef struct FT_SfntName_ + { + FT_UShort platform_id; + FT_UShort encoding_id; + FT_UShort language_id; + FT_UShort name_id; + + FT_Byte* string; /* this string is *not* null-terminated! */ + FT_UInt string_len; /* in bytes */ + + } FT_SfntName; + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_Name_Count */ + /* */ + /* <Description> */ + /* Retrieves the number of name strings in the SFNT `name' table. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* <Return> */ + /* The number of strings in the `name' table. */ + /* */ + FT_EXPORT( FT_UInt ) + FT_Get_Sfnt_Name_Count( FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_Name */ + /* */ + /* <Description> */ + /* Retrieves a string of the SFNT `name' table for a given index. */ + /* */ + /* <Input> */ + /* face :: A handle to the source face. */ + /* */ + /* idx :: The index of the `name' string. */ + /* */ + /* <Output> */ + /* aname :: The indexed @FT_SfntName structure. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The `string' array returned in the `aname' structure is not */ + /* null-terminated. */ + /* */ + /* Use @FT_Get_Sfnt_Name_Count to get the total number of available */ + /* `name' table entries, then do a loop until you get the right */ + /* platform, encoding, and name ID. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ); + + + /* */ + + +FT_END_HEADER + +#endif /* __FT_SFNT_NAMES_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftstroke.h b/libIGraph/include/freetype/ftstroke.h new file mode 100644 index 0000000..738b43c --- /dev/null +++ b/libIGraph/include/freetype/ftstroke.h @@ -0,0 +1,716 @@ +/***************************************************************************/ +/* */ +/* ftstroke.h */ +/* */ +/* FreeType path stroker (specification). */ +/* */ +/* Copyright 2002, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FT_STROKE_H__ +#define __FT_STROKE_H__ + +#include <ft2build.h> +#include FT_OUTLINE_H +#include FT_GLYPH_H + + +FT_BEGIN_HEADER + + + /************************************************************************ + * + * @section: + * glyph_stroker + * + * @title: + * Glyph Stroker + * + * @abstract: + * Generating bordered and stroked glyphs. + * + * @description: + * This component generates stroked outlines of a given vectorial + * glyph. It also allows you to retrieve the `outside' and/or the + * `inside' borders of the stroke. + * + * This can be useful to generate `bordered' glyph, i.e., glyphs + * displayed with a coloured (and anti-aliased) border around their + * shape. + */ + + + /************************************************************** + * + * @type: + * FT_Stroker + * + * @description: + * Opaque handler to a path stroker object. + */ + typedef struct FT_StrokerRec_* FT_Stroker; + + + /************************************************************** + * + * @enum: + * FT_Stroker_LineJoin + * + * @description: + * These values determine how two joining lines are rendered + * in a stroker. + * + * @values: + * FT_STROKER_LINEJOIN_ROUND :: + * Used to render rounded line joins. Circular arcs are used + * to join two lines smoothly. + * + * FT_STROKER_LINEJOIN_BEVEL :: + * Used to render beveled line joins; i.e., the two joining lines + * are extended until they intersect. + * + * FT_STROKER_LINEJOIN_MITER :: + * Same as beveled rendering, except that an additional line + * break is added if the angle between the two joining lines + * is too closed (this is useful to avoid unpleasant spikes + * in beveled rendering). + */ + typedef enum + { + FT_STROKER_LINEJOIN_ROUND = 0, + FT_STROKER_LINEJOIN_BEVEL, + FT_STROKER_LINEJOIN_MITER + + } FT_Stroker_LineJoin; + + + /************************************************************** + * + * @enum: + * FT_Stroker_LineCap + * + * @description: + * These values determine how the end of opened sub-paths are + * rendered in a stroke. + * + * @values: + * FT_STROKER_LINECAP_BUTT :: + * The end of lines is rendered as a full stop on the last + * point itself. + * + * FT_STROKER_LINECAP_ROUND :: + * The end of lines is rendered as a half-circle around the + * last point. + * + * FT_STROKER_LINECAP_SQUARE :: + * The end of lines is rendered as a square around the + * last point. + */ + typedef enum + { + FT_STROKER_LINECAP_BUTT = 0, + FT_STROKER_LINECAP_ROUND, + FT_STROKER_LINECAP_SQUARE + + } FT_Stroker_LineCap; + + + /************************************************************** + * + * @enum: + * FT_StrokerBorder + * + * @description: + * These values are used to select a given stroke border + * in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder. + * + * @values: + * FT_STROKER_BORDER_LEFT :: + * Select the left border, relative to the drawing direction. + * + * FT_STROKER_BORDER_RIGHT :: + * Select the right border, relative to the drawing direction. + * + * @note: + * Applications are generally interested in the `inside' and `outside' + * borders. However, there is no direct mapping between these and the + * `left' and `right' ones, since this really depends on the glyph's + * drawing orientation, which varies between font formats. + * + * You can however use @FT_Outline_GetInsideBorder and + * @FT_Outline_GetOutsideBorder to get these. + */ + typedef enum + { + FT_STROKER_BORDER_LEFT = 0, + FT_STROKER_BORDER_RIGHT + + } FT_StrokerBorder; + + + /************************************************************** + * + * @function: + * FT_Outline_GetInsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the + * `inside' borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Outline_GetOutsideBorder + * + * @description: + * Retrieve the @FT_StrokerBorder value corresponding to the + * `outside' borders of a given outline. + * + * @input: + * outline :: + * The source outline handle. + * + * @return: + * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid + * outlines. + */ + FT_EXPORT( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_New + * + * @description: + * Create a new stroker object. + * + * @input: + * library :: + * FreeType library handle. + * + * @output: + * astroker :: + * A new stroker object handle. NULL in case of error. + * + * @return: + * FreeType error code. 0 means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_New( FT_Library library, + FT_Stroker *astroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Set + * + * @description: + * Reset a stroker object's attributes. + * + * @input: + * stroker :: + * The target stroker handle. + * + * radius :: + * The border radius. + * + * line_cap :: + * The line cap style. + * + * line_join :: + * The line join style. + * + * miter_limit :: + * The miter limit for the FT_STROKER_LINEJOIN_MITER style, + * expressed as 16.16 fixed point value. + * + * @note: + * The radius is expressed in the same units that the outline + * coordinates. + */ + FT_EXPORT( void ) + FT_Stroker_Set( FT_Stroker stroker, + FT_Fixed radius, + FT_Stroker_LineCap line_cap, + FT_Stroker_LineJoin line_join, + FT_Fixed miter_limit ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Rewind + * + * @description: + * Reset a stroker object without changing its attributes. + * You should call this function before beginning a new + * series of calls to @FT_Stroker_BeginSubPath or + * @FT_Stroker_EndSubPath. + * + * @input: + * stroker :: + * The target stroker handle. + */ + FT_EXPORT( void ) + FT_Stroker_Rewind( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ParseOutline + * + * @description: + * A convenience function used to parse a whole outline with + * the stroker. The resulting outline(s) can be retrieved + * later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The source outline. + * + * opened :: + * A boolean. If 1, the outline is treated as an open path instead + * of a closed one. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * If `opened' is 0 (the default), the outline is treated as a closed + * path, and the stroker will generate two distinct `border' outlines. + * + * If `opened' is 1, the outline is processed as an open path, and the + * stroker will generate a single `stroke' outline. + * + * This function calls @FT_Stroker_Rewind automatically. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ParseOutline( FT_Stroker stroker, + FT_Outline* outline, + FT_Bool opened ); + + + /************************************************************** + * + * @function: + * FT_Stroker_BeginSubPath + * + * @description: + * Start a new sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the start vector. + * + * open :: + * A boolean. If 1, the sub-path is treated as an open one. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function is useful when you need to stroke a path that is + * not stored as an @FT_Outline object. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_BeginSubPath( FT_Stroker stroker, + FT_Vector* to, + FT_Bool open ); + + + /************************************************************** + * + * @function: + * FT_Stroker_EndSubPath + * + * @description: + * Close the current sub-path in the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * You should call this function after @FT_Stroker_BeginSubPath. + * If the subpath was not `opened', this function will `draw' a + * single line segment to the start position when needed. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_EndSubPath( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Stroker_LineTo + * + * @description: + * `Draw' a single line segment in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_LineTo( FT_Stroker stroker, + FT_Vector* to ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ConicTo + * + * @description: + * `Draw' a single quadratic Bézier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control :: + * A pointer to a Bézier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_ConicTo( FT_Stroker stroker, + FT_Vector* control, + FT_Vector* to ); + + + /************************************************************** + * + * @function: + * FT_Stroker_CubicTo + * + * @description: + * `Draw' a single cubic Bézier in the stroker's current sub-path, + * from the last position. + * + * @input: + * stroker :: + * The target stroker handle. + * + * control1 :: + * A pointer to the first Bézier control point. + * + * control2 :: + * A pointer to second Bézier control point. + * + * to :: + * A pointer to the destination point. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * You should call this function between @FT_Stroker_BeginSubPath and + * @FT_Stroker_EndSubPath. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_CubicTo( FT_Stroker stroker, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ); + + + /************************************************************** + * + * @function: + * FT_Stroker_GetBorderCounts + * + * @description: + * Call this function once you have finished parsing your paths + * with the stroker. It will return the number of points and + * contours necessary to export one of the `border' or `stroke' + * outlines generated by the stroker. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * When an outline, or a sub-path, is `closed', the stroker generates + * two independent `border' outlines, named `left' and `right'. + * + * When the outline, or a sub-path, is `opened', the stroker merges + * the `border' outlines with caps. The `left' border receives all + * points, while the `right' border becomes empty. + * + * Use the function @FT_Stroker_GetCounts instead if you want to + * retrieve the counts associated to both borders. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************** + * + * @function: + * FT_Stroker_ExportBorder + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to + * export the corresponding border to your own @FT_Outline + * structure. + * + * Note that this function will append the border points and + * contours to your outline, but will not try to resize its + * arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * border :: + * The border index. + * + * outline :: + * The target outline handle. + * + * @note: + * Always call this function after @FT_Stroker_GetBorderCounts to + * get sure that there is enough room in your @FT_Outline object to + * receive all new data. + * + * When an outline, or a sub-path, is `closed', the stroker generates + * two independent `border' outlines, named `left' and `right' + * + * When the outline, or a sub-path, is `opened', the stroker merges + * the `border' outlines with caps. The `left' border receives all + * points, while the `right' border becomes empty. + * + * Use the function @FT_Stroker_Export instead if you want to + * retrieve all borders at once. + */ + FT_EXPORT( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_GetCounts + * + * @description: + * Call this function once you have finished parsing your paths + * with the stroker. It returns the number of points and + * contours necessary to export all points/borders from the stroked + * outline/path. + * + * @input: + * stroker :: + * The target stroker handle. + * + * @output: + * anum_points :: + * The number of points. + * + * anum_contours :: + * The number of contours. + * + * @return: + * FreeType error code. 0 means success. + */ + FT_EXPORT( FT_Error ) + FT_Stroker_GetCounts( FT_Stroker stroker, + FT_UInt *anum_points, + FT_UInt *anum_contours ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Export + * + * @description: + * Call this function after @FT_Stroker_GetBorderCounts to + * export the all borders to your own @FT_Outline structure. + * + * Note that this function will append the border points and + * contours to your outline, but will not try to resize its + * arrays. + * + * @input: + * stroker :: + * The target stroker handle. + * + * outline :: + * The target outline handle. + */ + FT_EXPORT( void ) + FT_Stroker_Export( FT_Stroker stroker, + FT_Outline* outline ); + + + /************************************************************** + * + * @function: + * FT_Stroker_Done + * + * @description: + * Destroy a stroker object. + * + * @input: + * stroker :: + * A stroker handle. Can be NULL. + */ + FT_EXPORT( void ) + FT_Stroker_Done( FT_Stroker stroker ); + + + /************************************************************** + * + * @function: + * FT_Glyph_Stroke + * + * @description: + * Stroke a given outline glyph object with a given stroker. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * destroy :: + * A Boolean. If 1, the source glyph object is destroyed + * on success. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The source glyph is untouched in case of error. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ); + + + /************************************************************** + * + * @function: + * FT_Glyph_StrokeBorder + * + * @description: + * Stroke a given outline glyph object with a given stroker, but + * only return either its inside or outside border. + * + * @inout: + * pglyph :: + * Source glyph handle on input, new glyph handle on output. + * + * @input: + * stroker :: + * A stroker handle. + * + * inside :: + * A Boolean. If 1, return the inside border, otherwise + * the outside border. + * + * destroy :: + * A Boolean. If 1, the source glyph object is destroyed + * on success. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The source glyph is untouched in case of error. + */ + FT_EXPORT( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ); + + /* */ + +FT_END_HEADER + +#endif /* __FT_STROKE_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/libIGraph/include/freetype/ftsynth.h b/libIGraph/include/freetype/ftsynth.h new file mode 100644 index 0000000..36984bf --- /dev/null +++ b/libIGraph/include/freetype/ftsynth.h @@ -0,0 +1,73 @@ +/***************************************************************************/ +/* */ +/* ftsynth.h */ +/* */ +/* FreeType synthesizing code for emboldening and slanting */ +/* (specification). */ +/* */ +/* Copyright 2000-2001, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********* *********/ + /********* WARNING, THIS IS ALPHA CODE, THIS API *********/ + /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/ + /********* FREETYPE DEVELOPMENT TEAM *********/ + /********* *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifndef __FTSYNTH_H__ +#define __FTSYNTH_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /* Make sure slot owns slot->bitmap. */ + FT_EXPORT( FT_Error ) + FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ); + + /* Do not use this function directly! Copy the code to */ + /* your application and modify it to suit your need. */ + FT_EXPORT( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ); + + + FT_EXPORT( void ) + FT_GlyphSlot_Oblique( FT_GlyphSlot slot ); + + /* */ + +FT_END_HEADER + +#endif /* __FTSYNTH_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftsystem.h b/libIGraph/include/freetype/ftsystem.h new file mode 100644 index 0000000..59cd019 --- /dev/null +++ b/libIGraph/include/freetype/ftsystem.h @@ -0,0 +1,346 @@ +/***************************************************************************/ +/* */ +/* ftsystem.h */ +/* */ +/* FreeType low-level system interface definition (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTSYSTEM_H__ +#define __FTSYSTEM_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* system_interface */ + /* */ + /* <Title> */ + /* System Interface */ + /* */ + /* <Abstract> */ + /* How FreeType manages memory and i/o. */ + /* */ + /* <Description> */ + /* This section contains various definitions related to memory */ + /* management and i/o access. You need to understand this */ + /* information if you want to use a custom memory manager or you own */ + /* i/o streams. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* M E M O R Y M A N A G E M E N T */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * FT_Memory + * + * @description: + * A handle to a given memory manager object, defined with an + * @FT_MemoryRec structure. + * + */ + typedef struct FT_MemoryRec_* FT_Memory; + + + /************************************************************************* + * + * @functype: + * FT_Alloc_Func + * + * @description: + * A function used to allocate `size' bytes from `memory'. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * size :: + * The size in bytes to allocate. + * + * @return: + * Address of new memory block. 0 in case of failure. + * + */ + typedef void* + (*FT_Alloc_Func)( FT_Memory memory, + long size ); + + + /************************************************************************* + * + * @functype: + * FT_Free_Func + * + * @description: + * A function used to release a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * block :: + * The address of the target memory block. + * + */ + typedef void + (*FT_Free_Func)( FT_Memory memory, + void* block ); + + + /************************************************************************* + * + * @functype: + * FT_Realloc_Func + * + * @description: + * A function used to re-allocate a given block of memory. + * + * @input: + * memory :: + * A handle to the source memory manager. + * + * cur_size :: + * The block's current size in bytes. + * + * new_size :: + * The block's requested new size. + * + * block :: + * The block's current address. + * + * @return: + * New block address. 0 in case of memory shortage. + * + * @note: + * In case of error, the old block must still be available. + * + */ + typedef void* + (*FT_Realloc_Func)( FT_Memory memory, + long cur_size, + long new_size, + void* block ); + + + /************************************************************************* + * + * @struct: + * FT_MemoryRec + * + * @description: + * A structure used to describe a given memory manager to FreeType 2. + * + * @fields: + * user :: + * A generic typeless pointer for user data. + * + * alloc :: + * A pointer type to an allocation function. + * + * free :: + * A pointer type to an memory freeing function. + * + * realloc :: + * A pointer type to a reallocation function. + * + */ + struct FT_MemoryRec_ + { + void* user; + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + }; + + + /*************************************************************************/ + /* */ + /* I / O M A N A G E M E N T */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * FT_Stream + * + * @description: + * A handle to an input stream. + * + */ + typedef struct FT_StreamRec_* FT_Stream; + + + /************************************************************************* + * + * @struct: + * FT_StreamDesc + * + * @description: + * A union type used to store either a long or a pointer. This is used + * to store a file descriptor or a `FILE*' in an input stream. + * + */ + typedef union FT_StreamDesc_ + { + long value; + void* pointer; + + } FT_StreamDesc; + + + /************************************************************************* + * + * @functype: + * FT_Stream_IoFunc + * + * @description: + * A function used to seek and read data from a given input stream. + * + * @input: + * stream :: + * A handle to the source stream. + * + * offset :: + * The offset of read in stream (always from start). + * + * buffer :: + * The address of the read buffer. + * + * count :: + * The number of bytes to read from the stream. + * + * @return: + * The number of bytes effectively read by the stream. + * + * @note: + * This function might be called to perform a seek or skip operation + * with a `count' of 0. + * + */ + typedef unsigned long + (*FT_Stream_IoFunc)( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ); + + + /************************************************************************* + * + * @functype: + * FT_Stream_CloseFunc + * + * @description: + * A function used to close a given input stream. + * + * @input: + * stream :: + * A handle to the target stream. + * + */ + typedef void + (*FT_Stream_CloseFunc)( FT_Stream stream ); + + + /************************************************************************* + * + * @struct: + * FT_StreamRec + * + * @description: + * A structure used to describe an input stream. + * + * @input: + * base :: + * For memory-based streams, this is the address of the first stream + * byte in memory. This field should always be set to NULL for + * disk-based streams. + * + * size :: + * The stream size in bytes. + * + * pos :: + * The current position within the stream. + * + * descriptor :: + * This field is a union that can hold an integer or a pointer. It is + * used by stream implementations to store file descriptors or `FILE*' + * pointers. + * + * pathname :: + * This field is completely ignored by FreeType. However, it is often + * useful during debugging to use it to store the stream's filename + * (where available). + * + * read :: + * The stream's input function. + * + * close :: + * The stream;s close function. + * + * memory :: + * The memory manager to use to preload frames. This is set + * internally by FreeType and shouldn't be touched by stream + * implementations. + * + * cursor :: + * This field is set and used internally by FreeType when parsing + * frames. + * + * limit :: + * This field is set and used internally by FreeType when parsing + * frames. + * + */ + typedef struct FT_StreamRec_ + { + unsigned char* base; + unsigned long size; + unsigned long pos; + + FT_StreamDesc descriptor; + FT_StreamDesc pathname; + FT_Stream_IoFunc read; + FT_Stream_CloseFunc close; + + FT_Memory memory; + unsigned char* cursor; + unsigned char* limit; + + } FT_StreamRec; + + + /* */ + + +FT_END_HEADER + +#endif /* __FTSYSTEM_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/fttrigon.h b/libIGraph/include/freetype/fttrigon.h new file mode 100644 index 0000000..6b77d2e --- /dev/null +++ b/libIGraph/include/freetype/fttrigon.h @@ -0,0 +1,350 @@ +/***************************************************************************/ +/* */ +/* fttrigon.h */ +/* */ +/* FreeType trigonometric functions (specification). */ +/* */ +/* Copyright 2001, 2003, 2005, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTTRIGON_H__ +#define __FTTRIGON_H__ + +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* computations */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @type: + * FT_Angle + * + * @description: + * This type is used to model angle values in FreeType. Note that the + * angle is a 16.16 fixed float value expressed in degrees. + * + */ + typedef FT_Fixed FT_Angle; + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_PI + * + * @description: + * The angle pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI ( 180L << 16 ) + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_2PI + * + * @description: + * The angle 2*pi expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_2PI ( FT_ANGLE_PI * 2 ) + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_PI2 + * + * @description: + * The angle pi/2 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI2 ( FT_ANGLE_PI / 2 ) + + + /************************************************************************* + * + * @macro: + * FT_ANGLE_PI4 + * + * @description: + * The angle pi/4 expressed in @FT_Angle units. + * + */ +#define FT_ANGLE_PI4 ( FT_ANGLE_PI / 4 ) + + + /************************************************************************* + * + * @function: + * FT_Sin + * + * @description: + * Return the sinus of a given angle in fixed point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The sinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Sin( FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Cos + * + * @description: + * Return the cosinus of a given angle in fixed point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The cosinus value. + * + * @note: + * If you need both the sinus and cosinus for a given angle, use the + * function @FT_Vector_Unit. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Cos( FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Tan + * + * @description: + * Return the tangent of a given angle in fixed point format. + * + * @input: + * angle :: + * The input angle. + * + * @return: + * The tangent value. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Tan( FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Atan2 + * + * @description: + * Return the arc-tangent corresponding to a given vector (x,y) in + * the 2d plane. + * + * @input: + * x :: + * The horizontal vector coordinate. + * + * y :: + * The vertical vector coordinate. + * + * @return: + * The arc-tangent value (i.e. angle). + * + */ + FT_EXPORT( FT_Angle ) + FT_Atan2( FT_Fixed x, + FT_Fixed y ); + + + /************************************************************************* + * + * @function: + * FT_Angle_Diff + * + * @description: + * Return the difference between two angles. The result is always + * constrained to the ]-PI..PI] interval. + * + * @input: + * angle1 :: + * First angle. + * + * angle2 :: + * Second angle. + * + * @return: + * Constrained value of `value2-value1'. + * + */ + FT_EXPORT( FT_Angle ) + FT_Angle_Diff( FT_Angle angle1, + FT_Angle angle2 ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Unit + * + * @description: + * Return the unit vector corresponding to a given angle. After the + * call, the value of `vec.x' will be `sin(angle)', and the value of + * `vec.y' will be `cos(angle)'. + * + * This function is useful to retrieve both the sinus and cosinus of a + * given angle quickly. + * + * @output: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The address of angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Unit( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Rotate + * + * @description: + * Rotate a vector by a given angle. + * + * @inout: + * vec :: + * The address of target vector. + * + * @input: + * angle :: + * The address of angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Rotate( FT_Vector* vec, + FT_Angle angle ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Length + * + * @description: + * Return the length of a given vector. + * + * @input: + * vec :: + * The address of target vector. + * + * @return: + * The vector length, expressed in the same units that the original + * vector coordinates. + * + */ + FT_EXPORT( FT_Fixed ) + FT_Vector_Length( FT_Vector* vec ); + + + /************************************************************************* + * + * @function: + * FT_Vector_Polarize + * + * @description: + * Compute both the length and angle of a given vector. + * + * @input: + * vec :: + * The address of source vector. + * + * @output: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_Polarize( FT_Vector* vec, + FT_Fixed *length, + FT_Angle *angle ); + + + /************************************************************************* + * + * @function: + * FT_Vector_From_Polar + * + * @description: + * Compute vector coordinates from a length and angle. + * + * @output: + * vec :: + * The address of source vector. + * + * @input: + * length :: + * The vector length. + * + * angle :: + * The vector angle. + * + */ + FT_EXPORT( void ) + FT_Vector_From_Polar( FT_Vector* vec, + FT_Fixed length, + FT_Angle angle ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTTRIGON_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/fttypes.h b/libIGraph/include/freetype/fttypes.h new file mode 100644 index 0000000..2340bac --- /dev/null +++ b/libIGraph/include/freetype/fttypes.h @@ -0,0 +1,583 @@ +/***************************************************************************/ +/* */ +/* fttypes.h */ +/* */ +/* FreeType simple types definitions (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTTYPES_H__ +#define __FTTYPES_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_SYSTEM_H +#include FT_IMAGE_H + +#include <stddef.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* basic_types */ + /* */ + /* <Title> */ + /* Basic Data Types */ + /* */ + /* <Abstract> */ + /* The basic data types defined by the library. */ + /* */ + /* <Description> */ + /* This section contains the basic data types defined by FreeType 2, */ + /* ranging from simple scalar types to bitmap descriptors. More */ + /* font-specific structures are defined in a different section. */ + /* */ + /* <Order> */ + /* FT_Byte */ + /* FT_Bytes */ + /* FT_Char */ + /* FT_Int */ + /* FT_UInt */ + /* FT_Short */ + /* FT_UShort */ + /* FT_Long */ + /* FT_ULong */ + /* FT_Bool */ + /* FT_Offset */ + /* FT_PtrDist */ + /* FT_String */ + /* FT_Tag */ + /* FT_Error */ + /* FT_Fixed */ + /* FT_Pointer */ + /* FT_Pos */ + /* FT_Vector */ + /* FT_BBox */ + /* FT_Matrix */ + /* FT_FWord */ + /* FT_UFWord */ + /* FT_F2Dot14 */ + /* FT_UnitVector */ + /* FT_F26Dot6 */ + /* */ + /* */ + /* FT_Generic */ + /* FT_Generic_Finalizer */ + /* */ + /* FT_Bitmap */ + /* FT_Pixel_Mode */ + /* FT_Palette_Mode */ + /* FT_Glyph_Format */ + /* FT_IMAGE_TAG */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Bool */ + /* */ + /* <Description> */ + /* A typedef of unsigned char, used for simple booleans. As usual, */ + /* values 1 and 0 represent true and false, respectively. */ + /* */ + typedef unsigned char FT_Bool; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_FWord */ + /* */ + /* <Description> */ + /* A signed 16-bit integer used to store a distance in original font */ + /* units. */ + /* */ + typedef signed short FT_FWord; /* distance in FUnits */ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_UFWord */ + /* */ + /* <Description> */ + /* An unsigned 16-bit integer used to store a distance in original */ + /* font units. */ + /* */ + typedef unsigned short FT_UFWord; /* unsigned distance */ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Char */ + /* */ + /* <Description> */ + /* A simple typedef for the _signed_ char type. */ + /* */ + typedef signed char FT_Char; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Byte */ + /* */ + /* <Description> */ + /* A simple typedef for the _unsigned_ char type. */ + /* */ + typedef unsigned char FT_Byte; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Bytes */ + /* */ + /* <Description> */ + /* A typedef for constant memory areas. */ + /* */ + typedef const FT_Byte* FT_Bytes; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Tag */ + /* */ + /* <Description> */ + /* A typedef for 32bit tags (as used in the SFNT format). */ + /* */ + typedef FT_UInt32 FT_Tag; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_String */ + /* */ + /* <Description> */ + /* A simple typedef for the char type, usually used for strings. */ + /* */ + typedef char FT_String; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Short */ + /* */ + /* <Description> */ + /* A typedef for signed short. */ + /* */ + typedef signed short FT_Short; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_UShort */ + /* */ + /* <Description> */ + /* A typedef for unsigned short. */ + /* */ + typedef unsigned short FT_UShort; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Int */ + /* */ + /* <Description> */ + /* A typedef for the int type. */ + /* */ + typedef signed int FT_Int; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_UInt */ + /* */ + /* <Description> */ + /* A typedef for the unsigned int type. */ + /* */ + typedef unsigned int FT_UInt; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Long */ + /* */ + /* <Description> */ + /* A typedef for signed long. */ + /* */ + typedef signed long FT_Long; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_ULong */ + /* */ + /* <Description> */ + /* A typedef for unsigned long. */ + /* */ + typedef unsigned long FT_ULong; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_F2Dot14 */ + /* */ + /* <Description> */ + /* A signed 2.14 fixed float type used for unit vectors. */ + /* */ + typedef signed short FT_F2Dot14; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_F26Dot6 */ + /* */ + /* <Description> */ + /* A signed 26.6 fixed float type used for vectorial pixel */ + /* coordinates. */ + /* */ + typedef signed long FT_F26Dot6; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Fixed */ + /* */ + /* <Description> */ + /* This type is used to store 16.16 fixed float values, like scaling */ + /* values or matrix coefficients. */ + /* */ + typedef signed long FT_Fixed; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Error */ + /* */ + /* <Description> */ + /* The FreeType error code type. A value of 0 is always interpreted */ + /* as a successful operation. */ + /* */ + typedef int FT_Error; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Pointer */ + /* */ + /* <Description> */ + /* A simple typedef for a typeless pointer. */ + /* */ + typedef void* FT_Pointer; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_Offset */ + /* */ + /* <Description> */ + /* This is equivalent to the ANSI C `size_t' type, i.e., the largest */ + /* _unsigned_ integer type used to express a file size or position, */ + /* or a memory block size. */ + /* */ + typedef size_t FT_Offset; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_PtrDist */ + /* */ + /* <Description> */ + /* This is equivalent to the ANSI C `ptrdiff_t' type, i.e., the */ + /* largest _signed_ integer type used to express the distance */ + /* between two pointers. */ + /* */ + typedef ft_ptrdiff_t FT_PtrDist; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_UnitVector */ + /* */ + /* <Description> */ + /* A simple structure used to store a 2D vector unit vector. Uses */ + /* FT_F2Dot14 types. */ + /* */ + /* <Fields> */ + /* x :: Horizontal coordinate. */ + /* */ + /* y :: Vertical coordinate. */ + /* */ + typedef struct FT_UnitVector_ + { + FT_F2Dot14 x; + FT_F2Dot14 y; + + } FT_UnitVector; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Matrix */ + /* */ + /* <Description> */ + /* A simple structure used to store a 2x2 matrix. Coefficients are */ + /* in 16.16 fixed float format. The computation performed is: */ + /* */ + /* { */ + /* x' = x*xx + y*xy */ + /* y' = x*yx + y*yy */ + /* } */ + /* */ + /* <Fields> */ + /* xx :: Matrix coefficient. */ + /* */ + /* xy :: Matrix coefficient. */ + /* */ + /* yx :: Matrix coefficient. */ + /* */ + /* yy :: Matrix coefficient. */ + /* */ + typedef struct FT_Matrix_ + { + FT_Fixed xx, xy; + FT_Fixed yx, yy; + + } FT_Matrix; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Data */ + /* */ + /* <Description> */ + /* Read-only binary data represented as a pointer and a length. */ + /* */ + /* <Fields> */ + /* pointer :: The data. */ + /* */ + /* length :: The length of the data in bytes. */ + /* */ + typedef struct FT_Data_ + { + const FT_Byte* pointer; + FT_Int length; + + } FT_Data; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_Generic_Finalizer */ + /* */ + /* <Description> */ + /* Describes a function used to destroy the `client' data of any */ + /* FreeType object. See the description of the @FT_Generic type for */ + /* details of usage. */ + /* */ + /* <Input> */ + /* The address of the FreeType object which is under finalization. */ + /* Its client data is accessed through its `generic' field. */ + /* */ + typedef void (*FT_Generic_Finalizer)(void* object); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Generic */ + /* */ + /* <Description> */ + /* Client applications often need to associate their own data to a */ + /* variety of FreeType core objects. For example, a text layout API */ + /* might want to associate a glyph cache to a given size object. */ + /* */ + /* Most FreeType object contains a `generic' field, of type */ + /* FT_Generic, which usage is left to client applications and font */ + /* servers. */ + /* */ + /* It can be used to store a pointer to client-specific data, as well */ + /* as the address of a `finalizer' function, which will be called by */ + /* FreeType when the object is destroyed (for example, the previous */ + /* client example would put the address of the glyph cache destructor */ + /* in the `finalizer' field). */ + /* */ + /* <Fields> */ + /* data :: A typeless pointer to any client-specified data. This */ + /* field is completely ignored by the FreeType library. */ + /* */ + /* finalizer :: A pointer to a `generic finalizer' function, which */ + /* will be called when the object is destroyed. If this */ + /* field is set to NULL, no code will be called. */ + /* */ + typedef struct FT_Generic_ + { + void* data; + FT_Generic_Finalizer finalizer; + + } FT_Generic; + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_MAKE_TAG */ + /* */ + /* <Description> */ + /* This macro converts four-letter tags which are used to label */ + /* TrueType tables into an unsigned long to be used within FreeType. */ + /* */ + /* <Note> */ + /* The produced values *must* be 32bit integers. Don't redefine this */ + /* macro. */ + /* */ +#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + ( ( (FT_ULong)_x1 << 24 ) | \ + ( (FT_ULong)_x2 << 16 ) | \ + ( (FT_ULong)_x3 << 8 ) | \ + (FT_ULong)_x4 ) + + + /*************************************************************************/ + /*************************************************************************/ + /* */ + /* L I S T M A N A G E M E N T */ + /* */ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* list_processing */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_ListNode */ + /* */ + /* <Description> */ + /* Many elements and objects in FreeType are listed through an */ + /* @FT_List record (see @FT_ListRec). As its name suggests, an */ + /* FT_ListNode is a handle to a single list element. */ + /* */ + typedef struct FT_ListNodeRec_* FT_ListNode; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* FT_List */ + /* */ + /* <Description> */ + /* A handle to a list record (see @FT_ListRec). */ + /* */ + typedef struct FT_ListRec_* FT_List; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_ListNodeRec */ + /* */ + /* <Description> */ + /* A structure used to hold a single list element. */ + /* */ + /* <Fields> */ + /* prev :: The previous element in the list. NULL if first. */ + /* */ + /* next :: The next element in the list. NULL if last. */ + /* */ + /* data :: A typeless pointer to the listed object. */ + /* */ + typedef struct FT_ListNodeRec_ + { + FT_ListNode prev; + FT_ListNode next; + void* data; + + } FT_ListNodeRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_ListRec */ + /* */ + /* <Description> */ + /* A structure used to hold a simple doubly-linked list. These are */ + /* used in many parts of FreeType. */ + /* */ + /* <Fields> */ + /* head :: The head (first element) of doubly-linked list. */ + /* */ + /* tail :: The tail (last element) of doubly-linked list. */ + /* */ + typedef struct FT_ListRec_ + { + FT_ListNode head; + FT_ListNode tail; + + } FT_ListRec; + + + /* */ + +#define FT_IS_EMPTY( list ) ( (list).head == 0 ) + + /* return base error code (without module-specific prefix) */ +#define FT_ERROR_BASE( x ) ( (x) & 0xFF ) + + /* return module error code */ +#define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U ) + +#define FT_BOOL( x ) ( (FT_Bool)( x ) ) + +FT_END_HEADER + +#endif /* __FTTYPES_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ftwinfnt.h b/libIGraph/include/freetype/ftwinfnt.h new file mode 100644 index 0000000..a0063cc --- /dev/null +++ b/libIGraph/include/freetype/ftwinfnt.h @@ -0,0 +1,263 @@ +/***************************************************************************/ +/* */ +/* ftwinfnt.h */ +/* */ +/* FreeType API for accessing Windows fnt-specific data. */ +/* */ +/* Copyright 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTWINFNT_H__ +#define __FTWINFNT_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* winfnt_fonts */ + /* */ + /* <Title> */ + /* Window FNT Files */ + /* */ + /* <Abstract> */ + /* Windows FNT specific API. */ + /* */ + /* <Description> */ + /* This section contains the declaration of Windows FNT specific */ + /* functions. */ + /* */ + /*************************************************************************/ + + + /************************************************************************* + * + * @enum: + * FT_WinFNT_ID_XXX + * + * @description: + * A list of valid values for the `charset' byte in + * @FT_WinFNT_HeaderRec. Exact mapping tables for the various cpXXXX + * encodings (except for cp1361) can be found at ftp://ftp.unicode.org + * in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory. cp1361 is + * roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT. + * + * @values: + * FT_WinFNT_ID_DEFAULT :: + * This is used for font enumeration and font creation as a + * `don't care' value. Valid font files don't contain this value. + * When querying for information about the character set of the font + * that is currently selected into a specified device context, this + * return value (of the related Windows API) simply denotes failure. + * + * FT_WinFNT_ID_SYMBOL :: + * There is no known mapping table available. + * + * FT_WinFNT_ID_MAC :: + * Mac Roman encoding. + * + * FT_WinFNT_ID_OEM :: + * From Michael Pöttgen <michael@poettgen.de>: + * + * The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM + * is used for the charset of vector fonts, like `modern.fon', + * `roman.fon', and `script.fon' on Windows. + * + * The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value + * specifies a character set that is operating-system dependent. + * + * The `IFIMETRICS' documentation from the `Windows Driver + * Development Kit' says: This font supports an OEM-specific + * character set. The OEM character set is system dependent. + * + * In general OEM, as opposed to ANSI (i.e., cp1252), denotes the + * second default codepage that most international versions of + * Windows have. It is one of the OEM codepages from + * + * http://www.microsoft.com/globaldev/reference/cphome.mspx, + * + * and is used for the `DOS boxes', to support legacy applications. + * A German Windows version for example usually uses ANSI codepage + * 1252 and OEM codepage 850. + * + * FT_WinFNT_ID_CP874 :: + * A superset of Thai TIS 620 and ISO 8859-11. + * + * FT_WinFNT_ID_CP932 :: + * A superset of Japanese Shift-JIS (with minor deviations). + * + * FT_WinFNT_ID_CP936 :: + * A superset of simplified Chinese GB 2312-1980 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP949 :: + * A superset of Korean Hangul KS C 5601-1987 (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP950 :: + * A superset of traditional Chinese Big 5 ETen (with different + * ordering and minor deviations). + * + * FT_WinFNT_ID_CP1250 :: + * A superset of East European ISO 8859-2 (with slightly different + * ordering). + * + * FT_WinFNT_ID_CP1251 :: + * A superset of Russian ISO 8859-5 (with different ordering). + * + * FT_WinFNT_ID_CP1252 :: + * ANSI encoding. A superset of ISO 8859-1. + * + * FT_WinFNT_ID_CP1253 :: + * A superset of Greek ISO 8859-7 (with minor modifications). + * + * FT_WinFNT_ID_CP1254 :: + * A superset of Turkish ISO 8859-9. + * + * FT_WinFNT_ID_CP1255 :: + * A superset of Hebrew ISO 8859-8 (with some modifications). + * + * FT_WinFNT_ID_CP1256 :: + * A superset of Arabic ISO 8859-6 (with different ordering). + * + * FT_WinFNT_ID_CP1257 :: + * A superset of Baltic ISO 8859-13 (with some deviations). + * + * FT_WinFNT_ID_CP1258 :: + * For Vietnamese. This encoding doesn't cover all necessary + * characters. + * + * FT_WinFNT_ID_CP1361 :: + * Korean (Johab). + */ + +#define FT_WinFNT_ID_CP1252 0 +#define FT_WinFNT_ID_DEFAULT 1 +#define FT_WinFNT_ID_SYMBOL 2 +#define FT_WinFNT_ID_MAC 77 +#define FT_WinFNT_ID_CP932 128 +#define FT_WinFNT_ID_CP949 129 +#define FT_WinFNT_ID_CP1361 130 +#define FT_WinFNT_ID_CP936 134 +#define FT_WinFNT_ID_CP950 136 +#define FT_WinFNT_ID_CP1253 161 +#define FT_WinFNT_ID_CP1254 162 +#define FT_WinFNT_ID_CP1258 163 +#define FT_WinFNT_ID_CP1255 177 +#define FT_WinFNT_ID_CP1256 178 +#define FT_WinFNT_ID_CP1257 186 +#define FT_WinFNT_ID_CP1251 204 +#define FT_WinFNT_ID_CP874 222 +#define FT_WinFNT_ID_CP1250 238 +#define FT_WinFNT_ID_OEM 255 + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_WinFNT_HeaderRec */ + /* */ + /* <Description> */ + /* Windows FNT Header info. */ + /* */ + typedef struct FT_WinFNT_HeaderRec_ + { + FT_UShort version; + FT_ULong file_size; + FT_Byte copyright[60]; + FT_UShort file_type; + FT_UShort nominal_point_size; + FT_UShort vertical_resolution; + FT_UShort horizontal_resolution; + FT_UShort ascent; + FT_UShort internal_leading; + FT_UShort external_leading; + FT_Byte italic; + FT_Byte underline; + FT_Byte strike_out; + FT_UShort weight; + FT_Byte charset; + FT_UShort pixel_width; + FT_UShort pixel_height; + FT_Byte pitch_and_family; + FT_UShort avg_width; + FT_UShort max_width; + FT_Byte first_char; + FT_Byte last_char; + FT_Byte default_char; + FT_Byte break_char; + FT_UShort bytes_per_row; + FT_ULong device_offset; + FT_ULong face_name_offset; + FT_ULong bits_pointer; + FT_ULong bits_offset; + FT_Byte reserved; + FT_ULong flags; + FT_UShort A_space; + FT_UShort B_space; + FT_UShort C_space; + FT_UShort color_table_offset; + FT_ULong reserved1[4]; + + } FT_WinFNT_HeaderRec, *FT_WinFNT_Header; + + + /********************************************************************** + * + * @function: + * FT_Get_WinFNT_Header + * + * @description: + * Retrieve a Windows FNT font info header. + * + * @input: + * face :: A handle to the input face. + * + * @output: + * aheader :: The WinFNT header. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * This function only works with Windows FNT faces, returning an error + * otherwise. + */ + FT_EXPORT( FT_Error ) + FT_Get_WinFNT_Header( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + + /* */ + +FT_END_HEADER + +#endif /* __FTWINFNT_H__ */ + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/libIGraph/include/freetype/ftxf86.h b/libIGraph/include/freetype/ftxf86.h new file mode 100644 index 0000000..ea82abb --- /dev/null +++ b/libIGraph/include/freetype/ftxf86.h @@ -0,0 +1,80 @@ +/***************************************************************************/ +/* */ +/* ftxf86.h */ +/* */ +/* Support functions for X11. */ +/* */ +/* Copyright 2002, 2003, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTXF86_H__ +#define __FTXF86_H__ + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* font_formats */ + /* */ + /* <Title> */ + /* Font Formats */ + /* */ + /* <Abstract> */ + /* Getting the font format. */ + /* */ + /* <Description> */ + /* The single function in this section can be used to get the font */ + /* format. Note that this information is not needed normally; */ + /* however, there are special cases (like in PDF devices) where it is */ + /* important to differentiate, in spite of FreeType's uniform API. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_X11_Font_Format */ + /* */ + /* <Description> */ + /* Return a string describing the format of a given face, using values */ + /* which can be used as an X11 FONT_PROPERTY. Possible values are */ + /* `TrueType', `Type 1', `BDF', `PCF', `Type 42', `CID Type 1', `CFF', */ + /* `PFR', and `Windows FNT'. */ + /* */ + /* <Input> */ + /* face :: */ + /* Input face handle. */ + /* */ + /* <Return> */ + /* Font format string. NULL in case of error. */ + /* */ + FT_EXPORT( const char* ) + FT_Get_X11_Font_Format( FT_Face face ); + + /* */ + +FT_END_HEADER + +#endif /* __FTXF86_H__ */ diff --git a/libIGraph/include/freetype/internal/autohint.h b/libIGraph/include/freetype/internal/autohint.h new file mode 100644 index 0000000..cd9dce9 --- /dev/null +++ b/libIGraph/include/freetype/internal/autohint.h @@ -0,0 +1,205 @@ +/***************************************************************************/ +/* */ +/* autohint.h */ +/* */ +/* High-level `autohint' module-specific interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The auto-hinter is used to load and automatically hint glyphs if a */ + /* format-specific hinter isn't available. */ + /* */ + /*************************************************************************/ + + +#ifndef __AUTOHINT_H__ +#define __AUTOHINT_H__ + + + /*************************************************************************/ + /* */ + /* A small technical note regarding automatic hinting in order to */ + /* clarify this module interface. */ + /* */ + /* An automatic hinter might compute two kinds of data for a given face: */ + /* */ + /* - global hints: Usually some metrics that describe global properties */ + /* of the face. It is computed by scanning more or less */ + /* aggressively the glyphs in the face, and thus can be */ + /* very slow to compute (even if the size of global */ + /* hints is really small). */ + /* */ + /* - glyph hints: These describe some important features of the glyph */ + /* outline, as well as how to align them. They are */ + /* generally much faster to compute than global hints. */ + /* */ + /* The current FreeType auto-hinter does a pretty good job while */ + /* performing fast computations for both global and glyph hints. */ + /* However, we might be interested in introducing more complex and */ + /* powerful algorithms in the future, like the one described in the John */ + /* D. Hobby paper, which unfortunately requires a lot more horsepower. */ + /* */ + /* Because a sufficiently sophisticated font management system would */ + /* typically implement an LRU cache of opened face objects to reduce */ + /* memory usage, it is a good idea to be able to avoid recomputing */ + /* global hints every time the same face is re-opened. */ + /* */ + /* We thus provide the ability to cache global hints outside of the face */ + /* object, in order to speed up font re-opening time. Of course, this */ + /* feature is purely optional, so most client programs won't even notice */ + /* it. */ + /* */ + /* I initially thought that it would be a good idea to cache the glyph */ + /* hints too. However, my general idea now is that if you really need */ + /* to cache these too, you are simply in need of a new font format, */ + /* where all this information could be stored within the font file and */ + /* decoded on the fly. */ + /* */ + /*************************************************************************/ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + typedef struct FT_AutoHinterRec_ *FT_AutoHinter; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlobalGetFunc */ + /* */ + /* <Description> */ + /* Retrieves the global hints computed for a given face object the */ + /* resulting data is dissociated from the face and will survive a */ + /* call to FT_Done_Face(). It must be discarded through the API */ + /* FT_AutoHinter_GlobalDoneFunc(). */ + /* */ + /* <Input> */ + /* hinter :: A handle to the source auto-hinter. */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* <Output> */ + /* global_hints :: A typeless pointer to the global hints. */ + /* */ + /* global_len :: The size in bytes of the global hints. */ + /* */ + typedef void + (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter hinter, + FT_Face face, + void** global_hints, + long* global_len ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlobalDoneFunc */ + /* */ + /* <Description> */ + /* Discards the global hints retrieved through */ + /* FT_AutoHinter_GlobalGetFunc(). This is the only way these hints */ + /* are freed from memory. */ + /* */ + /* <Input> */ + /* hinter :: A handle to the auto-hinter module. */ + /* */ + /* global :: A pointer to retrieved global hints to discard. */ + /* */ + typedef void + (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter hinter, + void* global ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlobalResetFunc */ + /* */ + /* <Description> */ + /* This function is used to recompute the global metrics in a given */ + /* font. This is useful when global font data changes (e.g. Multiple */ + /* Masters fonts where blend coordinates change). */ + /* */ + /* <Input> */ + /* hinter :: A handle to the source auto-hinter. */ + /* */ + /* face :: A handle to the face. */ + /* */ + typedef void + (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter hinter, + FT_Face face ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* FT_AutoHinter_GlyphLoadFunc */ + /* */ + /* <Description> */ + /* This function is used to load, scale, and automatically hint a */ + /* glyph from a given face. */ + /* */ + /* <Input> */ + /* face :: A handle to the face. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* load_flags :: The load flags. */ + /* */ + /* <Note> */ + /* This function is capable of loading composite glyphs by hinting */ + /* each sub-glyph independently (which improves quality). */ + /* */ + /* It will call the font driver with FT_Load_Glyph(), with */ + /* FT_LOAD_NO_SCALE set. */ + /* */ + typedef FT_Error + (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter hinter, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_AutoHinter_ServiceRec */ + /* */ + /* <Description> */ + /* The auto-hinter module's interface. */ + /* */ + typedef struct FT_AutoHinter_ServiceRec_ + { + FT_AutoHinter_GlobalResetFunc reset_face; + FT_AutoHinter_GlobalGetFunc get_global_hints; + FT_AutoHinter_GlobalDoneFunc done_global_hints; + FT_AutoHinter_GlyphLoadFunc load_glyph; + + } FT_AutoHinter_ServiceRec, *FT_AutoHinter_Service; + + +FT_END_HEADER + +#endif /* __AUTOHINT_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/ftcalc.h b/libIGraph/include/freetype/internal/ftcalc.h new file mode 100644 index 0000000..8810bc5 --- /dev/null +++ b/libIGraph/include/freetype/internal/ftcalc.h @@ -0,0 +1,153 @@ +/***************************************************************************/ +/* */ +/* ftcalc.h */ +/* */ +/* Arithmetic computations (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTCALC_H__ +#define __FTCALC_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_FixedSqrt */ + /* */ + /* <Description> */ + /* Computes the square root of a 16.16 fixed point value. */ + /* */ + /* <Input> */ + /* x :: The value to compute the root for. */ + /* */ + /* <Return> */ + /* The result of `sqrt(x)'. */ + /* */ + /* <Note> */ + /* This function is not very fast. */ + /* */ + FT_BASE( FT_Int32 ) + FT_SqrtFixed( FT_Int32 x ); + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Sqrt32 */ + /* */ + /* <Description> */ + /* Computes the square root of an Int32 integer (which will be */ + /* handled as an unsigned long value). */ + /* */ + /* <Input> */ + /* x :: The value to compute the root for. */ + /* */ + /* <Return> */ + /* The result of `sqrt(x)'. */ + /* */ + FT_EXPORT( FT_Int32 ) + FT_Sqrt32( FT_Int32 x ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* FT_MulDiv() and FT_MulFix() are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_MulDiv_No_Round */ + /* */ + /* <Description> */ + /* A very simple function used to perform the computation `(a*b)/c' */ + /* (without rounding) with maximal accuracy (it uses a 64-bit */ + /* intermediate integer whenever necessary). */ + /* */ + /* This function isn't necessarily as fast as some processor specific */ + /* operations, but is at least completely portable. */ + /* */ + /* <Input> */ + /* a :: The first multiplier. */ + /* b :: The second multiplier. */ + /* c :: The divisor. */ + /* */ + /* <Return> */ + /* The result of `(a*b)/c'. This function never traps when trying to */ + /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */ + /* on the signs of `a' and `b'. */ + /* */ + FT_BASE( FT_Long ) + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ); + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /* + * Return -1, 0, or +1, depending on the orientation of a given corner. + * We use the Cartesian coordinate system, with positive vertical values + * going upwards. The function returns +1 if the corner turns to the + * left, -1 to the right, and 0 for undecidable cases. + */ + FT_BASE( FT_Int ) + ft_corner_orientation( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ); + + /* + * Return TRUE if a corner is flat or nearly flat. This is equivalent to + * saying that the angle difference between the `in' and `out' vectors is + * very small. + */ + FT_BASE( FT_Int ) + ft_corner_is_flat( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ); + + +#define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 ) +#define INT_TO_F2DOT14( x ) ( (FT_Long)(x) << 14 ) +#define INT_TO_FIXED( x ) ( (FT_Long)(x) << 16 ) +#define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) << 2 ) +#define FLOAT_TO_FIXED( x ) ( (FT_Long)( x * 65536.0 ) ) + +#define ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \ + : ( -( ( 32 - (x) ) & -64 ) ) ) + + +FT_END_HEADER + +#endif /* __FTCALC_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/ftdebug.h b/libIGraph/include/freetype/internal/ftdebug.h new file mode 100644 index 0000000..f05edc8 --- /dev/null +++ b/libIGraph/include/freetype/internal/ftdebug.h @@ -0,0 +1,244 @@ +/***************************************************************************/ +/* */ +/* ftdebug.h */ +/* */ +/* Debugging and logging component (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/* */ +/* IMPORTANT: A description of FreeType's debugging support can be */ +/* found in `docs/DEBUG.TXT'. Read it if you need to use or */ +/* understand this code. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTDEBUG_H__ +#define __FTDEBUG_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */ + /* is already defined; this simplifies the following #ifdefs */ + /* */ +#ifdef FT_DEBUG_LEVEL_TRACE +#undef FT_DEBUG_LEVEL_ERROR +#define FT_DEBUG_LEVEL_ERROR +#endif + + + /*************************************************************************/ + /* */ + /* Define the trace enums as well as the trace levels array when they */ + /* are needed. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define FT_TRACE_DEF( x ) trace_ ## x , + + /* defining the enumeration */ + typedef enum + { +#include FT_INTERNAL_TRACE_H + trace_count + + } FT_Trace; + + + /* defining the array of trace levels, provided by `src/base/ftdebug.c' */ + extern int ft_trace_levels[trace_count]; + +#undef FT_TRACE_DEF + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /* */ + /* Define the FT_TRACE macro */ + /* */ + /* IMPORTANT! */ + /* */ + /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */ + /* value before using any TRACE macro. */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_TRACE + +#define FT_TRACE( level, varformat ) \ + do \ + { \ + if ( ft_trace_levels[FT_COMPONENT] >= level ) \ + FT_Message varformat; \ + } while ( 0 ) + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define FT_TRACE( level, varformat ) do ; while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Trace_Get_Count */ + /* */ + /* <Description> */ + /* Return the number of available trace components. */ + /* */ + /* <Return> */ + /* The number of trace components. 0 if FreeType 2 is not built with */ + /* FT_DEBUG_LEVEL_TRACE definition. */ + /* */ + /* <Note> */ + /* This function may be useful if you want to access elements of */ + /* the internal `ft_trace_levels' array by an index. */ + /* */ + FT_BASE( FT_Int ) + FT_Trace_Get_Count( void ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Trace_Get_Name */ + /* */ + /* <Description> */ + /* Return the name of a trace component. */ + /* */ + /* <Input> */ + /* The index of the trace component. */ + /* */ + /* <Return> */ + /* The name of the trace component. This is a statically allocated */ + /* C string, so do not free it after use. NULL if FreeType 2 is not */ + /* built with FT_DEBUG_LEVEL_TRACE definition. */ + /* */ + /* <Note> */ + /* Use @FT_Trace_Get_Count to get the number of available trace */ + /* components. */ + /* */ + /* This function may be useful if you want to control FreeType 2's */ + /* debug level in your application. */ + /* */ + FT_BASE( const char * ) + FT_Trace_Get_Name( FT_Int idx ); + + + /*************************************************************************/ + /* */ + /* You need two opening resp. closing parentheses! */ + /* */ + /* Example: FT_TRACE0(( "Value is %i", foo )) */ + /* */ + /*************************************************************************/ + +#define FT_TRACE0( varformat ) FT_TRACE( 0, varformat ) +#define FT_TRACE1( varformat ) FT_TRACE( 1, varformat ) +#define FT_TRACE2( varformat ) FT_TRACE( 2, varformat ) +#define FT_TRACE3( varformat ) FT_TRACE( 3, varformat ) +#define FT_TRACE4( varformat ) FT_TRACE( 4, varformat ) +#define FT_TRACE5( varformat ) FT_TRACE( 5, varformat ) +#define FT_TRACE6( varformat ) FT_TRACE( 6, varformat ) +#define FT_TRACE7( varformat ) FT_TRACE( 7, varformat ) + + + /*************************************************************************/ + /* */ + /* Define the FT_ERROR macro */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#define FT_ERROR( varformat ) FT_Message varformat + +#else /* !FT_DEBUG_LEVEL_ERROR */ + +#define FT_ERROR( varformat ) do ; while ( 0 ) /* nothing */ + +#endif /* !FT_DEBUG_LEVEL_ERROR */ + + + /*************************************************************************/ + /* */ + /* Define the FT_ASSERT macro */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#define FT_ASSERT( condition ) \ + do \ + { \ + if ( !( condition ) ) \ + FT_Panic( "assertion failed on line %d of file %s\n", \ + __LINE__, __FILE__ ); \ + } while ( 0 ) + +#else /* !FT_DEBUG_LEVEL_ERROR */ + +#define FT_ASSERT( condition ) do ; while ( 0 ) + +#endif /* !FT_DEBUG_LEVEL_ERROR */ + + + /*************************************************************************/ + /* */ + /* Define `FT_Message' and `FT_Panic' when needed */ + /* */ + /*************************************************************************/ + +#ifdef FT_DEBUG_LEVEL_ERROR + +#include "stdio.h" /* for vprintf() */ + + /* print a message */ + FT_BASE( void ) + FT_Message( const char* fmt, ... ); + + /* print a message and exit */ + FT_BASE( void ) + FT_Panic( const char* fmt, ... ); + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + + FT_BASE( void ) + ft_debug_init( void ); + + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + + /* we disable the warning `conditional expression is constant' here */ + /* in order to compile cleanly with the maximum level of warnings */ +#pragma warning( disable : 4127 ) + +#endif /* _MSC_VER */ + + +FT_END_HEADER + +#endif /* __FTDEBUG_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/ftdriver.h b/libIGraph/include/freetype/internal/ftdriver.h new file mode 100644 index 0000000..d38af05 --- /dev/null +++ b/libIGraph/include/freetype/internal/ftdriver.h @@ -0,0 +1,252 @@ +/***************************************************************************/ +/* */ +/* ftdriver.h */ +/* */ +/* FreeType font driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTDRIVER_H__ +#define __FTDRIVER_H__ + + +#include <ft2build.h> +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + typedef FT_Error + (*FT_Face_InitFunc)( FT_Stream stream, + FT_Face face, + FT_Int typeface_index, + FT_Int num_params, + FT_Parameter* parameters ); + + typedef void + (*FT_Face_DoneFunc)( FT_Face face ); + + + typedef FT_Error + (*FT_Size_InitFunc)( FT_Size size ); + + typedef void + (*FT_Size_DoneFunc)( FT_Size size ); + + + typedef FT_Error + (*FT_Slot_InitFunc)( FT_GlyphSlot slot ); + + typedef void + (*FT_Slot_DoneFunc)( FT_GlyphSlot slot ); + + + typedef FT_Error + (*FT_Size_RequestFunc)( FT_Size size, + FT_Size_Request req ); + + typedef FT_Error + (*FT_Size_SelectFunc)( FT_Size size, + FT_ULong size_index ); + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + typedef FT_Error + (*FT_Size_ResetPointsFunc)( FT_Size size, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ); + + typedef FT_Error + (*FT_Size_ResetPixelsFunc)( FT_Size size, + FT_UInt pixel_width, + FT_UInt pixel_height ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + typedef FT_Error + (*FT_Slot_LoadFunc)( FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + + typedef FT_UInt + (*FT_CharMap_CharIndexFunc)( FT_CharMap charmap, + FT_Long charcode ); + + typedef FT_Long + (*FT_CharMap_CharNextFunc)( FT_CharMap charmap, + FT_Long charcode ); + + typedef FT_Error + (*FT_Face_GetKerningFunc)( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ); + + + typedef FT_Error + (*FT_Face_AttachFunc)( FT_Face face, + FT_Stream stream ); + + + typedef FT_Error + (*FT_Face_GetAdvancesFunc)( FT_Face face, + FT_UInt first, + FT_UInt count, + FT_Bool vertical, + FT_UShort* advances ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Driver_ClassRec */ + /* */ + /* <Description> */ + /* The font driver class. This structure mostly contains pointers to */ + /* driver methods. */ + /* */ + /* <Fields> */ + /* root :: The parent module. */ + /* */ + /* face_object_size :: The size of a face object in bytes. */ + /* */ + /* size_object_size :: The size of a size object in bytes. */ + /* */ + /* slot_object_size :: The size of a glyph object in bytes. */ + /* */ + /* init_face :: The format-specific face constructor. */ + /* */ + /* done_face :: The format-specific face destructor. */ + /* */ + /* init_size :: The format-specific size constructor. */ + /* */ + /* done_size :: The format-specific size destructor. */ + /* */ + /* init_slot :: The format-specific slot constructor. */ + /* */ + /* done_slot :: The format-specific slot destructor. */ + /* */ + /* */ + /* load_glyph :: A function handle to load a glyph to a slot. */ + /* This field is mandatory! */ + /* */ + /* get_char_index :: A function handle to return the glyph index of */ + /* a given character for a given charmap. This */ + /* field is mandatory! */ + /* */ + /* get_kerning :: A function handle to return the unscaled */ + /* kerning for a given pair of glyphs. Can be */ + /* set to 0 if the format doesn't support */ + /* kerning. */ + /* */ + /* attach_file :: This function handle is used to read */ + /* additional data for a face from another */ + /* file/stream. For example, this can be used to */ + /* add data from AFM or PFM files on a Type 1 */ + /* face, or a CIDMap on a CID-keyed face. */ + /* */ + /* get_advances :: A function handle used to return advance */ + /* widths of `count' glyphs (in font units), */ + /* starting at `first'. The `vertical' flag must */ + /* be set to get vertical advance heights. The */ + /* `advances' buffer is caller-allocated. */ + /* Currently not implemented. The idea of this */ + /* function is to be able to perform */ + /* device-independent text layout without loading */ + /* a single glyph image. */ + /* */ + /* request_size :: A handle to a function used to request the new */ + /* character size. Can be set to 0 if the */ + /* scaling done in the base layer suffices. */ + /* */ + /* select_size :: A handle to a function used to select a new */ + /* fixed size. It is used only if */ + /* @FT_FACE_FLAG_FIXED_SIZES is set. Can be set */ + /* to 0 if the scaling done in the base layer */ + /* suffices. */ + /* <Note> */ + /* Most function pointers, with the exception of `load_glyph' and */ + /* `get_char_index' can be set to 0 to indicate a default behaviour. */ + /* */ + typedef struct FT_Driver_ClassRec_ + { + FT_Module_Class root; + + FT_Long face_object_size; + FT_Long size_object_size; + FT_Long slot_object_size; + + FT_Face_InitFunc init_face; + FT_Face_DoneFunc done_face; + + FT_Size_InitFunc init_size; + FT_Size_DoneFunc done_size; + + FT_Slot_InitFunc init_slot; + FT_Slot_DoneFunc done_slot; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_Size_ResetPointsFunc set_char_sizes; + FT_Size_ResetPixelsFunc set_pixel_sizes; + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + FT_Slot_LoadFunc load_glyph; + + FT_Face_GetKerningFunc get_kerning; + FT_Face_AttachFunc attach_file; + FT_Face_GetAdvancesFunc get_advances; + + /* since version 2.2 */ + FT_Size_RequestFunc request_size; + FT_Size_SelectFunc select_size; + + } FT_Driver_ClassRec, *FT_Driver_Class; + + + /* + * The following functions are used as stubs for `set_char_sizes' and + * `set_pixel_sizes'; the code uses `request_size' and `select_size' + * functions instead. + * + * Implementation is in `src/base/ftobjs.c'. + */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_BASE( FT_Error ) + ft_stub_set_char_sizes( FT_Size size, + FT_F26Dot6 width, + FT_F26Dot6 height, + FT_UInt horz_res, + FT_UInt vert_res ); + + FT_BASE( FT_Error ) + ft_stub_set_pixel_sizes( FT_Size size, + FT_UInt width, + FT_UInt height ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + +FT_END_HEADER + +#endif /* __FTDRIVER_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/ftgloadr.h b/libIGraph/include/freetype/internal/ftgloadr.h new file mode 100644 index 0000000..798ad8e --- /dev/null +++ b/libIGraph/include/freetype/internal/ftgloadr.h @@ -0,0 +1,168 @@ +/***************************************************************************/ +/* */ +/* ftgloadr.h */ +/* */ +/* The FreeType glyph loader (specification). */ +/* */ +/* Copyright 2002, 2003, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTGLOADR_H__ +#define __FTGLOADR_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_GlyphLoader */ + /* */ + /* <Description> */ + /* The glyph loader is an internal object used to load several glyphs */ + /* together (for example, in the case of composites). */ + /* */ + /* <Note> */ + /* The glyph loader implementation is not part of the high-level API, */ + /* hence the forward structure declaration. */ + /* */ + typedef struct FT_GlyphLoaderRec_* FT_GlyphLoader ; + + +#if 0 /* moved to freetype.h in version 2.2 */ +#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1 +#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2 +#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4 +#define FT_SUBGLYPH_FLAG_SCALE 8 +#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40 +#define FT_SUBGLYPH_FLAG_2X2 0x80 +#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200 +#endif + + + typedef struct FT_SubGlyphRec_ + { + FT_Int index; + FT_UShort flags; + FT_Int arg1; + FT_Int arg2; + FT_Matrix transform; + + } FT_SubGlyphRec; + + + typedef struct FT_GlyphLoadRec_ + { + FT_Outline outline; /* outline */ + FT_Vector* extra_points; /* extra points table */ + FT_Vector* extra_points2; /* second extra points table */ + FT_UInt num_subglyphs; /* number of subglyphs */ + FT_SubGlyph subglyphs; /* subglyphs */ + + } FT_GlyphLoadRec, *FT_GlyphLoad; + + + typedef struct FT_GlyphLoaderRec_ + { + FT_Memory memory; + FT_UInt max_points; + FT_UInt max_contours; + FT_UInt max_subglyphs; + FT_Bool use_extra; + + FT_GlyphLoadRec base; + FT_GlyphLoadRec current; + + void* other; /* for possible future extension? */ + + } FT_GlyphLoaderRec; + + + /* create new empty glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_New( FT_Memory memory, + FT_GlyphLoader *aloader ); + + /* add an extra points table to a glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ); + + /* destroy a glyph loader */ + FT_BASE( void ) + FT_GlyphLoader_Done( FT_GlyphLoader loader ); + + /* reset a glyph loader (frees everything int it) */ + FT_BASE( void ) + FT_GlyphLoader_Reset( FT_GlyphLoader loader ); + + /* rewind a glyph loader */ + FT_BASE( void ) + FT_GlyphLoader_Rewind( FT_GlyphLoader loader ); + + /* check that there is enough space to add `n_points' and `n_contours' */ + /* to the glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, + FT_UInt n_points, + FT_UInt n_contours ); + + +#define FT_GLYPHLOADER_CHECK_P( _loader, _count ) \ + ( (_count) == 0 || (int)((_loader)->base.outline.n_points + \ + (_loader)->current.outline.n_points + \ + (_count)) <= (int)(_loader)->max_points ) + +#define FT_GLYPHLOADER_CHECK_C( _loader, _count ) \ + ( (_count) == 0 || (int)((_loader)->base.outline.n_contours + \ + (_loader)->current.outline.n_contours + \ + (_count)) <= (int)(_loader)->max_contours ) + +#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points,_contours ) \ + ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points ) && \ + FT_GLYPHLOADER_CHECK_C( _loader, _contours ) ) \ + ? 0 \ + : FT_GlyphLoader_CheckPoints( (_loader), (_points), (_contours) ) ) + + + /* check that there is enough space to add `n_subs' sub-glyphs to */ + /* a glyph loader */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, + FT_UInt n_subs ); + + /* prepare a glyph loader, i.e. empty the current glyph */ + FT_BASE( void ) + FT_GlyphLoader_Prepare( FT_GlyphLoader loader ); + + /* add the current glyph to the base glyph */ + FT_BASE( void ) + FT_GlyphLoader_Add( FT_GlyphLoader loader ); + + /* copy points from one glyph loader to another */ + FT_BASE( FT_Error ) + FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, + FT_GlyphLoader source ); + + /* */ + + +FT_END_HEADER + +#endif /* __FTGLOADR_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/ftmemory.h b/libIGraph/include/freetype/internal/ftmemory.h new file mode 100644 index 0000000..23a00de --- /dev/null +++ b/libIGraph/include/freetype/internal/ftmemory.h @@ -0,0 +1,368 @@ +/***************************************************************************/ +/* */ +/* ftmemory.h */ +/* */ +/* The FreeType memory management macros (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTMEMORY_H__ +#define __FTMEMORY_H__ + + +#include <ft2build.h> +#include FT_CONFIG_CONFIG_H +#include FT_TYPES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Macro> */ + /* FT_SET_ERROR */ + /* */ + /* <Description> */ + /* This macro is used to set an implicit `error' variable to a given */ + /* expression's value (usually a function call), and convert it to a */ + /* boolean which is set whenever the value is != 0. */ + /* */ +#undef FT_SET_ERROR +#define FT_SET_ERROR( expression ) \ + ( ( error = (expression) ) != 0 ) + + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M E M O R Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* + * C++ refuses to handle statements like p = (void*)anything; where `p' + * is a typed pointer. Since we don't have a `typeof' operator in + * standard C++, we have to use ugly casts. + */ + +#ifdef __cplusplus +#define FT_ASSIGNP( p, val ) *((void**)&(p)) = (val) +#else +#define FT_ASSIGNP( p, val ) (p) = (val) +#endif + + + +#ifdef FT_DEBUG_MEMORY + + FT_BASE( const char* ) _ft_debug_file; + FT_BASE( long ) _ft_debug_lineno; + +#define FT_DEBUG_INNER( exp ) ( _ft_debug_file = __FILE__, \ + _ft_debug_lineno = __LINE__, \ + (exp) ) + +#define FT_ASSIGNP_INNER( p, exp ) ( _ft_debug_file = __FILE__, \ + _ft_debug_lineno = __LINE__, \ + FT_ASSIGNP( p, exp ) ) + +#else /* !FT_DEBUG_MEMORY */ + +#define FT_DEBUG_INNER( exp ) (exp) +#define FT_ASSIGNP_INNER( p, exp ) FT_ASSIGNP( p, exp ) + +#endif /* !FT_DEBUG_MEMORY */ + + + /* + * The allocation functions return a pointer, and the error code + * is written to through the `p_error' parameter. See below for + * for documentation. + */ + + FT_BASE( FT_Pointer ) + ft_mem_alloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_qalloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_realloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_qrealloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ); + + FT_BASE( void ) + ft_mem_free( FT_Memory memory, + const void* P ); + + +#define FT_MEM_ALLOC( ptr, size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, (size), &error ) ) + +#define FT_MEM_FREE( ptr ) \ + FT_BEGIN_STMNT \ + ft_mem_free( memory, (ptr) ); \ + (ptr) = NULL; \ + FT_END_STMNT + +#define FT_MEM_NEW( ptr ) \ + FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) ) + +#define FT_MEM_REALLOC( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, 1, \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_QALLOC( ptr, size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, (size), &error ) ) + +#define FT_MEM_QNEW( ptr ) \ + FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) ) + +#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, 1, \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, (item_size), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, (itmsz), \ + (oldcnt), (newcnt), \ + (ptr), &error ) ) + +#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, (item_size), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, (itmsz), \ + (oldcnt), (newcnt), \ + (ptr), &error ) ) + + +#define FT_MEM_SET_ERROR( cond ) ( (cond), error != 0 ) + + +#define FT_MEM_SET( dest, byte, count ) ft_memset( dest, byte, count ) + +#define FT_MEM_COPY( dest, source, count ) ft_memcpy( dest, source, count ) + +#define FT_MEM_MOVE( dest, source, count ) ft_memmove( dest, source, count ) + + +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) + +#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) + + +#define FT_ARRAY_ZERO( dest, count ) \ + FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) ) + +#define FT_ARRAY_COPY( dest, source, count ) \ + FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) ) + +#define FT_ARRAY_MOVE( dest, source, count ) \ + FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) ) + + + /* + * Return the maximum number of addressable elements in an array. + * We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid + * any problems. + */ +#define FT_ARRAY_MAX( ptr ) ( FT_INT_MAX / sizeof ( *(ptr) ) ) + +#define FT_ARRAY_CHECK( ptr, count ) ( (count) <= FT_ARRAY_MAX( ptr ) ) + + + /*************************************************************************/ + /* */ + /* The following functions macros expect that their pointer argument is */ + /* _typed_ in order to automatically compute array element sizes. */ + /* */ + +#define FT_MEM_NEW_ARRAY( ptr, count ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \ + (cursz), (newsz), \ + (ptr), &error ) ) + +#define FT_MEM_QNEW_ARRAY( ptr, count ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \ + 0, (count), \ + NULL, &error ) ) + +#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \ + FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \ + (cursz), (newsz), \ + (ptr), &error ) ) + + +#define FT_ALLOC( ptr, size ) \ + FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) ) + +#define FT_REALLOC( ptr, cursz, newsz ) \ + FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) ) + +#define FT_ALLOC_MULT( ptr, count, item_size ) \ + FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) ) + +#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt, \ + newcnt, itmsz ) ) + +#define FT_QALLOC( ptr, size ) \ + FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) ) + +#define FT_QREALLOC( ptr, cursz, newsz ) \ + FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) ) + +#define FT_QALLOC_MULT( ptr, count, item_size ) \ + FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) ) + +#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \ + FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt, \ + newcnt, itmsz ) ) + +#define FT_FREE( ptr ) FT_MEM_FREE( ptr ) + +#define FT_NEW( ptr ) FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) ) + +#define FT_NEW_ARRAY( ptr, count ) \ + FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) + +#define FT_RENEW_ARRAY( ptr, curcnt, newcnt ) \ + FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) + +#define FT_QNEW( ptr ) \ + FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) ) + +#define FT_QNEW_ARRAY( ptr, count ) \ + FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) ) + +#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt ) \ + FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) ) + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + FT_BASE( FT_Error ) + FT_Alloc( FT_Memory memory, + FT_Long size, + void* *P ); + + FT_BASE( FT_Error ) + FT_QAlloc( FT_Memory memory, + FT_Long size, + void* *p ); + + FT_BASE( FT_Error ) + FT_Realloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void* *P ); + + FT_BASE( FT_Error ) + FT_QRealloc( FT_Memory memory, + FT_Long current, + FT_Long size, + void* *p ); + + FT_BASE( void ) + FT_Free( FT_Memory memory, + void* *P ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + FT_BASE( FT_Pointer ) + ft_mem_strdup( FT_Memory memory, + const char* str, + FT_Error *p_error ); + + FT_BASE( FT_Pointer ) + ft_mem_dup( FT_Memory memory, + const void* address, + FT_ULong size, + FT_Error *p_error ); + +#define FT_MEM_STRDUP( dst, str ) \ + (dst) = ft_mem_strdup( memory, (const char*)(str), &error ) + +#define FT_STRDUP( dst, str ) \ + FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) ) + +#define FT_MEM_DUP( dst, address, size ) \ + (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error ) + +#define FT_DUP( dst, address, size ) \ + FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) ) + + + /* Return >= 1 if a truncation occurs. */ + /* Return 0 if the source string fits the buffer. */ + /* This is *not* the same as strlcpy(). */ + FT_BASE( FT_Int ) + ft_mem_strcpyn( char* dst, + const char* src, + FT_ULong size ); + +#define FT_STRCPYN( dst, src, size ) \ + ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) ) + + /* */ + + +FT_END_HEADER + +#endif /* __FTMEMORY_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/ftobjs.h b/libIGraph/include/freetype/internal/ftobjs.h new file mode 100644 index 0000000..eddafcb --- /dev/null +++ b/libIGraph/include/freetype/internal/ftobjs.h @@ -0,0 +1,820 @@ +/***************************************************************************/ +/* */ +/* ftobjs.h */ +/* */ +/* The FreeType private base classes (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file contains the definition of all internal FreeType classes. */ + /* */ + /*************************************************************************/ + + +#ifndef __FTOBJS_H__ +#define __FTOBJS_H__ + +#include <ft2build.h> +#include FT_RENDER_H +#include FT_SIZES_H +#include FT_LCD_FILTER_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_GLYPH_LOADER_H +#include FT_INTERNAL_DRIVER_H +#include FT_INTERNAL_AUTOHINT_H +#include FT_INTERNAL_SERVICE_H + +#ifdef FT_CONFIG_OPTION_INCREMENTAL +#include FT_INCREMENTAL_H +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* Some generic definitions. */ + /* */ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void*)0 +#endif + + + /*************************************************************************/ + /* */ + /* The min and max functions missing in C. As usual, be careful not to */ + /* write things like FT_MIN( a++, b++ ) to avoid side effects. */ + /* */ +#define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) ) +#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) + +#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) ) + + +#define FT_PAD_FLOOR( x, n ) ( (x) & ~((n)-1) ) +#define FT_PAD_ROUND( x, n ) FT_PAD_FLOOR( (x) + ((n)/2), n ) +#define FT_PAD_CEIL( x, n ) FT_PAD_FLOOR( (x) + ((n)-1), n ) + +#define FT_PIX_FLOOR( x ) ( (x) & ~63 ) +#define FT_PIX_ROUND( x ) FT_PIX_FLOOR( (x) + 32 ) +#define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 ) + + + /* + * Return the highest power of 2 that is <= value; this correspond to + * the highest bit in a given 32-bit value. + */ + FT_BASE( FT_UInt32 ) + ft_highpow2( FT_UInt32 value ); + + + /* + * character classification functions -- since these are used to parse + * font files, we must not use those in <ctypes.h> which are + * locale-dependent + */ +#define ft_isdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U ) + +#define ft_isxdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U || \ + ( (unsigned)(x) - 'a' ) < 6U || \ + ( (unsigned)(x) - 'A' ) < 6U ) + + /* the next two macros assume ASCII representation */ +#define ft_isupper( x ) ( ( (unsigned)(x) - 'A' ) < 26U ) +#define ft_islower( x ) ( ( (unsigned)(x) - 'a' ) < 26U ) + +#define ft_isalpha( x ) ( ft_isupper( x ) || ft_islower( x ) ) +#define ft_isalnum( x ) ( ft_isdigit( x ) || ft_isalpha( x ) ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** C H A R M A P S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to internal charmap object */ + typedef struct FT_CMapRec_* FT_CMap; + + /* handle to charmap class structure */ + typedef const struct FT_CMap_ClassRec_* FT_CMap_Class; + + /* internal charmap object structure */ + typedef struct FT_CMapRec_ + { + FT_CharMapRec charmap; + FT_CMap_Class clazz; + + } FT_CMapRec; + + /* typecase any pointer to a charmap handle */ +#define FT_CMAP( x ) ((FT_CMap)( x )) + + /* obvious macros */ +#define FT_CMAP_PLATFORM_ID( x ) FT_CMAP( x )->charmap.platform_id +#define FT_CMAP_ENCODING_ID( x ) FT_CMAP( x )->charmap.encoding_id +#define FT_CMAP_ENCODING( x ) FT_CMAP( x )->charmap.encoding +#define FT_CMAP_FACE( x ) FT_CMAP( x )->charmap.face + + + /* class method definitions */ + typedef FT_Error + (*FT_CMap_InitFunc)( FT_CMap cmap, + FT_Pointer init_data ); + + typedef void + (*FT_CMap_DoneFunc)( FT_CMap cmap ); + + typedef FT_UInt + (*FT_CMap_CharIndexFunc)( FT_CMap cmap, + FT_UInt32 char_code ); + + typedef FT_UInt + (*FT_CMap_CharNextFunc)( FT_CMap cmap, + FT_UInt32 *achar_code ); + + + typedef struct FT_CMap_ClassRec_ + { + FT_ULong size; + FT_CMap_InitFunc init; + FT_CMap_DoneFunc done; + FT_CMap_CharIndexFunc char_index; + FT_CMap_CharNextFunc char_next; + + } FT_CMap_ClassRec; + + + /* create a new charmap and add it to charmap->face */ + FT_BASE( FT_Error ) + FT_CMap_New( FT_CMap_Class clazz, + FT_Pointer init_data, + FT_CharMap charmap, + FT_CMap *acmap ); + + /* destroy a charmap and remove it from face's list */ + FT_BASE( void ) + FT_CMap_Done( FT_CMap cmap ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Face_InternalRec */ + /* */ + /* <Description> */ + /* This structure contains the internal fields of each FT_Face */ + /* object. These fields may change between different releases of */ + /* FreeType. */ + /* */ + /* <Fields> */ + /* max_points :: */ + /* The maximal number of points used to store the vectorial outline */ + /* of any glyph in this face. If this value cannot be known in */ + /* advance, or if the face isn't scalable, this should be set to 0. */ + /* Only relevant for scalable formats. */ + /* */ + /* max_contours :: */ + /* The maximal number of contours used to store the vectorial */ + /* outline of any glyph in this face. If this value cannot be */ + /* known in advance, or if the face isn't scalable, this should be */ + /* set to 0. Only relevant for scalable formats. */ + /* */ + /* transform_matrix :: */ + /* A 2x2 matrix of 16.16 coefficients used to transform glyph */ + /* outlines after they are loaded from the font. Only used by the */ + /* convenience functions. */ + /* */ + /* transform_delta :: */ + /* A translation vector used to transform glyph outlines after they */ + /* are loaded from the font. Only used by the convenience */ + /* functions. */ + /* */ + /* transform_flags :: */ + /* Some flags used to classify the transform. Only used by the */ + /* convenience functions. */ + /* */ + /* services :: */ + /* A cache for frequently used services. It should be only */ + /* accessed with the macro `FT_FACE_LOOKUP_SERVICE'. */ + /* */ + /* incremental_interface :: */ + /* If non-null, the interface through which glyph data and metrics */ + /* are loaded incrementally for faces that do not provide all of */ + /* this data when first opened. This field exists only if */ + /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */ + /* */ + /* ignore_unpatented_hinter :: */ + /* This boolean flag instructs the glyph loader to ignore the */ + /* native font hinter, if one is found. This is exclusively used */ + /* in the case when the unpatented hinter is compiled within the */ + /* library. */ + /* */ + typedef struct FT_Face_InternalRec_ + { +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_UShort reserved1; + FT_Short reserved2; +#endif + FT_Matrix transform_matrix; + FT_Vector transform_delta; + FT_Int transform_flags; + + FT_ServiceCacheRec services; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_Incremental_InterfaceRec* incremental_interface; +#endif + + FT_Bool ignore_unpatented_hinter; + + } FT_Face_InternalRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_Slot_InternalRec */ + /* */ + /* <Description> */ + /* This structure contains the internal fields of each FT_GlyphSlot */ + /* object. These fields may change between different releases of */ + /* FreeType. */ + /* */ + /* <Fields> */ + /* loader :: The glyph loader object used to load outlines */ + /* into the glyph slot. */ + /* */ + /* flags :: Possible values are zero or */ + /* FT_GLYPH_OWN_BITMAP. The latter indicates */ + /* that the FT_GlyphSlot structure owns the */ + /* bitmap buffer. */ + /* */ + /* glyph_transformed :: Boolean. Set to TRUE when the loaded glyph */ + /* must be transformed through a specific */ + /* font transformation. This is _not_ the same */ + /* as the face transform set through */ + /* FT_Set_Transform(). */ + /* */ + /* glyph_matrix :: The 2x2 matrix corresponding to the glyph */ + /* transformation, if necessary. */ + /* */ + /* glyph_delta :: The 2d translation vector corresponding to */ + /* the glyph transformation, if necessary. */ + /* */ + /* glyph_hints :: Format-specific glyph hints management. */ + /* */ + +#define FT_GLYPH_OWN_BITMAP 0x1 + + typedef struct FT_Slot_InternalRec_ + { + FT_GlyphLoader loader; + FT_UInt flags; + FT_Bool glyph_transformed; + FT_Matrix glyph_matrix; + FT_Vector glyph_delta; + void* glyph_hints; + + } FT_GlyphSlot_InternalRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M O D U L E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_ModuleRec */ + /* */ + /* <Description> */ + /* A module object instance. */ + /* */ + /* <Fields> */ + /* clazz :: A pointer to the module's class. */ + /* */ + /* library :: A handle to the parent library object. */ + /* */ + /* memory :: A handle to the memory manager. */ + /* */ + /* generic :: A generic structure for user-level extensibility (?). */ + /* */ + typedef struct FT_ModuleRec_ + { + FT_Module_Class* clazz; + FT_Library library; + FT_Memory memory; + FT_Generic generic; + + } FT_ModuleRec; + + + /* typecast an object to a FT_Module */ +#define FT_MODULE( x ) ((FT_Module)( x )) +#define FT_MODULE_CLASS( x ) FT_MODULE( x )->clazz +#define FT_MODULE_LIBRARY( x ) FT_MODULE( x )->library +#define FT_MODULE_MEMORY( x ) FT_MODULE( x )->memory + + +#define FT_MODULE_IS_DRIVER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_FONT_DRIVER ) + +#define FT_MODULE_IS_RENDERER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_RENDERER ) + +#define FT_MODULE_IS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_HINTER ) + +#define FT_MODULE_IS_STYLER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_STYLER ) + +#define FT_DRIVER_IS_SCALABLE( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_SCALABLE ) + +#define FT_DRIVER_USES_OUTLINES( x ) !( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_NO_OUTLINES ) + +#define FT_DRIVER_HAS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \ + FT_MODULE_DRIVER_HAS_HINTER ) + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Module_Interface */ + /* */ + /* <Description> */ + /* Finds a module and returns its specific interface as a typeless */ + /* pointer. */ + /* */ + /* <Input> */ + /* library :: A handle to the library object. */ + /* */ + /* module_name :: The module's name (as an ASCII string). */ + /* */ + /* <Return> */ + /* A module-specific interface if available, 0 otherwise. */ + /* */ + /* <Note> */ + /* You should better be familiar with FreeType internals to know */ + /* which module to look for, and what its interface is :-) */ + /* */ + FT_BASE( const void* ) + FT_Get_Module_Interface( FT_Library library, + const char* mod_name ); + + FT_BASE( FT_Pointer ) + ft_module_get_service( FT_Module module, + const char* service_id ); + + /* */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* a few macros used to perform easy typecasts with minimal brain damage */ + +#define FT_FACE( x ) ((FT_Face)(x)) +#define FT_SIZE( x ) ((FT_Size)(x)) +#define FT_SLOT( x ) ((FT_GlyphSlot)(x)) + +#define FT_FACE_DRIVER( x ) FT_FACE( x )->driver +#define FT_FACE_LIBRARY( x ) FT_FACE_DRIVER( x )->root.library +#define FT_FACE_MEMORY( x ) FT_FACE( x )->memory +#define FT_FACE_STREAM( x ) FT_FACE( x )->stream + +#define FT_SIZE_FACE( x ) FT_SIZE( x )->face +#define FT_SLOT_FACE( x ) FT_SLOT( x )->face + +#define FT_FACE_SLOT( x ) FT_FACE( x )->glyph +#define FT_FACE_SIZE( x ) FT_FACE( x )->size + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_GlyphSlot */ + /* */ + /* <Description> */ + /* It is sometimes useful to have more than one glyph slot for a */ + /* given face object. This function is used to create additional */ + /* slots. All of them are automatically discarded when the face is */ + /* destroyed. */ + /* */ + /* <Input> */ + /* face :: A handle to a parent face object. */ + /* */ + /* <Output> */ + /* aslot :: A handle to a new glyph slot object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + FT_BASE( FT_Error ) + FT_New_GlyphSlot( FT_Face face, + FT_GlyphSlot *aslot ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_GlyphSlot */ + /* */ + /* <Description> */ + /* Destroys a given glyph slot. Remember however that all slots are */ + /* automatically destroyed with its parent. Using this function is */ + /* not always mandatory. */ + /* */ + /* <Input> */ + /* slot :: A handle to a target glyph slot. */ + /* */ + FT_BASE( void ) + FT_Done_GlyphSlot( FT_GlyphSlot slot ); + + /* */ + +#define FT_REQUEST_WIDTH( req ) \ + ( (req)->horiResolution \ + ? (FT_Pos)( (req)->width * (req)->horiResolution + 36 ) / 72 \ + : (req)->width ) + +#define FT_REQUEST_HEIGHT( req ) \ + ( (req)->vertResolution \ + ? (FT_Pos)( (req)->height * (req)->vertResolution + 36 ) / 72 \ + : (req)->height ) + + + /* Set the metrics according to a bitmap strike. */ + FT_BASE( void ) + FT_Select_Metrics( FT_Face face, + FT_ULong strike_index ); + + + /* Set the metrics according to a size request. */ + FT_BASE( void ) + FT_Request_Metrics( FT_Face face, + FT_Size_Request req ); + + + /* Match a size request against `available_sizes'. */ + FT_BASE( FT_Error ) + FT_Match_Size( FT_Face face, + FT_Size_Request req, + FT_Bool ignore_width, + FT_ULong* size_index ); + + + /* Use the horizontal metrics to synthesize the vertical metrics. */ + /* If `advance' is zero, it is also synthesized. */ + FT_BASE( void ) + ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, + FT_Pos advance ); + + + /* Free the bitmap of a given glyphslot when needed (i.e., only when it */ + /* was allocated with ft_glyphslot_alloc_bitmap). */ + FT_BASE( void ) + ft_glyphslot_free_bitmap( FT_GlyphSlot slot ); + + + /* Allocate a new bitmap buffer in a glyph slot. */ + FT_BASE( FT_Error ) + ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, + FT_ULong size ); + + + /* Set the bitmap buffer in a glyph slot to a given pointer. The buffer */ + /* will not be freed by a later call to ft_glyphslot_free_bitmap. */ + FT_BASE( void ) + ft_glyphslot_set_bitmap( FT_GlyphSlot slot, + FT_Byte* buffer ); + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** R E N D E R E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#define FT_RENDERER( x ) ((FT_Renderer)( x )) +#define FT_GLYPH( x ) ((FT_Glyph)( x )) +#define FT_BITMAP_GLYPH( x ) ((FT_BitmapGlyph)( x )) +#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x )) + + + typedef struct FT_RendererRec_ + { + FT_ModuleRec root; + FT_Renderer_Class* clazz; + FT_Glyph_Format glyph_format; + FT_Glyph_Class glyph_class; + + FT_Raster raster; + FT_Raster_Render_Func raster_render; + FT_Renderer_RenderFunc render; + + } FT_RendererRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F O N T D R I V E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* typecast a module into a driver easily */ +#define FT_DRIVER( x ) ((FT_Driver)(x)) + + /* typecast a module as a driver, and get its driver class */ +#define FT_DRIVER_CLASS( x ) FT_DRIVER( x )->clazz + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_DriverRec */ + /* */ + /* <Description> */ + /* The root font driver class. A font driver is responsible for */ + /* managing and loading font files of a given format. */ + /* */ + /* <Fields> */ + /* root :: Contains the fields of the root module class. */ + /* */ + /* clazz :: A pointer to the font driver's class. Note that */ + /* this is NOT root.clazz. `class' wasn't used */ + /* as it is a reserved word in C++. */ + /* */ + /* faces_list :: The list of faces currently opened by this */ + /* driver. */ + /* */ + /* extensions :: A typeless pointer to the driver's extensions */ + /* registry, if they are supported through the */ + /* configuration macro FT_CONFIG_OPTION_EXTENSIONS. */ + /* */ + /* glyph_loader :: The glyph loader for all faces managed by this */ + /* driver. This object isn't defined for unscalable */ + /* formats. */ + /* */ + typedef struct FT_DriverRec_ + { + FT_ModuleRec root; + FT_Driver_Class clazz; + + FT_ListRec faces_list; + void* extensions; + + FT_GlyphLoader glyph_loader; + + } FT_DriverRec; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** L I B R A R I E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* This hook is used by the TrueType debugger. It must be set to an */ + /* alternate truetype bytecode interpreter function. */ +#define FT_DEBUG_HOOK_TRUETYPE 0 + + + /* Set this debug hook to a non-null pointer to force unpatented hinting */ + /* for all faces when both TT_USE_BYTECODE_INTERPRETER and */ + /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined. This is only used */ + /* during debugging. */ +#define FT_DEBUG_HOOK_UNPATENTED_HINTING 1 + + + typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap, + FT_Render_Mode render_mode, + FT_Library library ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* FT_LibraryRec */ + /* */ + /* <Description> */ + /* The FreeType library class. This is the root of all FreeType */ + /* data. Use FT_New_Library() to create a library object, and */ + /* FT_Done_Library() to discard it and all child objects. */ + /* */ + /* <Fields> */ + /* memory :: The library's memory object. Manages memory */ + /* allocation. */ + /* */ + /* generic :: Client data variable. Used to extend the */ + /* Library class by higher levels and clients. */ + /* */ + /* version_major :: The major version number of the library. */ + /* */ + /* version_minor :: The minor version number of the library. */ + /* */ + /* version_patch :: The current patch level of the library. */ + /* */ + /* num_modules :: The number of modules currently registered */ + /* within this library. This is set to 0 for new */ + /* libraries. New modules are added through the */ + /* FT_Add_Module() API function. */ + /* */ + /* modules :: A table used to store handles to the currently */ + /* registered modules. Note that each font driver */ + /* contains a list of its opened faces. */ + /* */ + /* renderers :: The list of renderers currently registered */ + /* within the library. */ + /* */ + /* cur_renderer :: The current outline renderer. This is a */ + /* shortcut used to avoid parsing the list on */ + /* each call to FT_Outline_Render(). It is a */ + /* handle to the current renderer for the */ + /* FT_GLYPH_FORMAT_OUTLINE format. */ + /* */ + /* auto_hinter :: XXX */ + /* */ + /* raster_pool :: The raster object's render pool. This can */ + /* ideally be changed dynamically at run-time. */ + /* */ + /* raster_pool_size :: The size of the render pool in bytes. */ + /* */ + /* debug_hooks :: XXX */ + /* */ + typedef struct FT_LibraryRec_ + { + FT_Memory memory; /* library's memory manager */ + + FT_Generic generic; + + FT_Int version_major; + FT_Int version_minor; + FT_Int version_patch; + + FT_UInt num_modules; + FT_Module modules[FT_MAX_MODULES]; /* module objects */ + + FT_ListRec renderers; /* list of renderers */ + FT_Renderer cur_renderer; /* current outline renderer */ + FT_Module auto_hinter; + + FT_Byte* raster_pool; /* scan-line conversion */ + /* render pool */ + FT_ULong raster_pool_size; /* size of render pool in bytes */ + + FT_DebugHook_Func debug_hooks[4]; + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + FT_LcdFilter lcd_filter; + FT_Int lcd_extra; /* number of extra pixels */ + FT_Byte lcd_weights[7]; /* filter weights, if any */ + FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ +#endif + + } FT_LibraryRec; + + + FT_BASE( FT_Renderer ) + FT_Lookup_Renderer( FT_Library library, + FT_Glyph_Format format, + FT_ListNode* node ); + + FT_BASE( FT_Error ) + FT_Render_Glyph_Internal( FT_Library library, + FT_GlyphSlot slot, + FT_Render_Mode render_mode ); + + typedef const char* + (*FT_Face_GetPostscriptNameFunc)( FT_Face face ); + + typedef FT_Error + (*FT_Face_GetGlyphNameFunc)( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + typedef FT_UInt + (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face, + FT_String* glyph_name ); + + +#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_New_Memory */ + /* */ + /* <Description> */ + /* Creates a new memory object. */ + /* */ + /* <Return> */ + /* A pointer to the new memory object. 0 in case of error. */ + /* */ + FT_BASE( FT_Memory ) + FT_New_Memory( void ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Done_Memory */ + /* */ + /* <Description> */ + /* Discards memory manager. */ + /* */ + /* <Input> */ + /* memory :: A handle to the memory manager. */ + /* */ + FT_BASE( void ) + FT_Done_Memory( FT_Memory memory ); + +#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ + + + /* Define default raster's interface. The default raster is located in */ + /* `src/base/ftraster.c'. */ + /* */ + /* Client applications can register new rasters through the */ + /* FT_Set_Raster() API. */ + +#ifndef FT_NO_DEFAULT_RASTER + FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster; +#endif + + +FT_END_HEADER + +#endif /* __FTOBJS_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/ftrfork.h b/libIGraph/include/freetype/internal/ftrfork.h new file mode 100644 index 0000000..d67af52 --- /dev/null +++ b/libIGraph/include/freetype/internal/ftrfork.h @@ -0,0 +1,184 @@ +/***************************************************************************/ +/* */ +/* ftrfork.h */ +/* */ +/* Embedded resource forks accessor (specification). */ +/* */ +/* Copyright 2004, 2006 by */ +/* Masatake YAMATO and Redhat K.K. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* Development of the code in this file is support of */ +/* Information-technology Promotion Agency, Japan. */ +/***************************************************************************/ + + +#ifndef __FTRFORK_H__ +#define __FTRFORK_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /* Number of guessing rules supported in `FT_Raccess_Guess'. */ + /* Don't forget to increment the number if you add a new guessing rule. */ +#define FT_RACCESS_N_RULES 8 + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Raccess_Guess */ + /* */ + /* <Description> */ + /* Guess a file name and offset where the actual resource fork is */ + /* stored. The macro FT_RACCESS_N_RULES holds the number of */ + /* guessing rules; the guessed result for the Nth rule is */ + /* represented as a triplet: a new file name (new_names[N]), a file */ + /* offset (offsets[N]), and an error code (errors[N]). */ + /* */ + /* <Input> */ + /* library :: */ + /* A FreeType library instance. */ + /* */ + /* stream :: */ + /* A file stream containing the resource fork. */ + /* */ + /* base_name :: */ + /* The (base) file name of the resource fork used for some */ + /* guessing rules. */ + /* */ + /* <Output> */ + /* new_names :: */ + /* An array of guessed file names in which the resource forks may */ + /* exist. If `new_names[N]' is NULL, the guessed file name is */ + /* equal to `base_name'. */ + /* */ + /* offsets :: */ + /* An array of guessed file offsets. `offsets[N]' holds the file */ + /* offset of the possible start of the resource fork in file */ + /* `new_names[N]'. */ + /* */ + /* errors :: */ + /* An array of FreeType error codes. `errors[N]' is the error */ + /* code of Nth guessing rule function. If `errors[N]' is not */ + /* FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless. */ + /* */ + FT_BASE( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char* base_name, + char** new_names, + FT_Long* offsets, + FT_Error* errors ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Raccess_Get_HeaderInfo */ + /* */ + /* <Description> */ + /* Get the information from the header of resource fork. The */ + /* information includes the file offset where the resource map */ + /* starts, and the file offset where the resource data starts. */ + /* `FT_Raccess_Get_DataOffsets' requires these two data. */ + /* */ + /* <Input> */ + /* library :: */ + /* A FreeType library instance. */ + /* */ + /* stream :: */ + /* A file stream containing the resource fork. */ + /* */ + /* rfork_offset :: */ + /* The file offset where the resource fork starts. */ + /* */ + /* <Output> */ + /* map_offset :: */ + /* The file offset where the resource map starts. */ + /* */ + /* rdata_pos :: */ + /* The file offset where the resource data starts. */ + /* */ + /* <Return> */ + /* FreeType error code. FT_Err_Ok means success. */ + /* */ + FT_BASE( FT_Error ) + FT_Raccess_Get_HeaderInfo( FT_Library library, + FT_Stream stream, + FT_Long rfork_offset, + FT_Long *map_offset, + FT_Long *rdata_pos ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Raccess_Get_DataOffsets */ + /* */ + /* <Description> */ + /* Get the data offsets for a tag in a resource fork. Offsets are */ + /* stored in an array because, in some cases, resources in a resource */ + /* fork have the same tag. */ + /* */ + /* <Input> */ + /* library :: */ + /* A FreeType library instance. */ + /* */ + /* stream :: */ + /* A file stream containing the resource fork. */ + /* */ + /* map_offset :: */ + /* The file offset where the resource map starts. */ + /* */ + /* rdata_pos :: */ + /* The file offset where the resource data starts. */ + /* */ + /* tag :: */ + /* The resource tag. */ + /* */ + /* <Output> */ + /* offsets :: */ + /* The stream offsets for the resource data specified by `tag'. */ + /* This array is allocated by the function, so you have to call */ + /* @ft_mem_free after use. */ + /* */ + /* count :: */ + /* The length of offsets array. */ + /* */ + /* <Return> */ + /* FreeType error code. FT_Err_Ok means success. */ + /* */ + /* <Note> */ + /* Normally you should use `FT_Raccess_Get_HeaderInfo' to get the */ + /* value for `map_offset' and `rdata_pos'. */ + /* */ + FT_BASE( FT_Error ) + FT_Raccess_Get_DataOffsets( FT_Library library, + FT_Stream stream, + FT_Long map_offset, + FT_Long rdata_pos, + FT_Long tag, + FT_Long **offsets, + FT_Long *count ); + + +FT_END_HEADER + +#endif /* __FTRFORK_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/ftserv.h b/libIGraph/include/freetype/internal/ftserv.h new file mode 100644 index 0000000..bee3b8b --- /dev/null +++ b/libIGraph/include/freetype/internal/ftserv.h @@ -0,0 +1,327 @@ +/***************************************************************************/ +/* */ +/* ftserv.h */ +/* */ +/* The FreeType services (specification only). */ +/* */ +/* Copyright 2003, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Each module can export one or more `services'. Each service is */ + /* identified by a constant string and modeled by a pointer; the latter */ + /* generally corresponds to a structure containing function pointers. */ + /* */ + /* Note that a service's data cannot be a mere function pointer because */ + /* in C it is possible that function pointers might be implemented */ + /* differently than data pointers (e.g. 48 bits instead of 32). */ + /* */ + /*************************************************************************/ + + +#ifndef __FTSERV_H__ +#define __FTSERV_H__ + + +FT_BEGIN_HEADER + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + + /* we disable the warning `conditional expression is constant' here */ + /* in order to compile cleanly with the maximum level of warnings */ +#pragma warning( disable : 4127 ) + +#endif /* _MSC_VER */ + + /* + * @macro: + * FT_FACE_FIND_SERVICE + * + * @description: + * This macro is used to look up a service from a face's driver module. + * + * @input: + * face :: + * The source face handle. + * + * id :: + * A string describing the service as defined in the service's + * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to + * `multi-masters'). It is automatically prefixed with + * `FT_SERVICE_ID_'. + * + * @output: + * ptr :: + * A variable that receives the service pointer. Will be NULL + * if not found. + */ +#ifdef __cplusplus + +#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_ = NULL; \ + FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ + \ + \ + if ( module->clazz->get_interface ) \ + _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ + *_pptr_ = _tmp_; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_FIND_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_ = NULL; \ + \ + if ( module->clazz->get_interface ) \ + _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \ + ptr = _tmp_; \ + FT_END_STMNT + +#endif /* !C++ */ + + /* + * @macro: + * FT_FACE_FIND_GLOBAL_SERVICE + * + * @description: + * This macro is used to look up a service from all modules. + * + * @input: + * face :: + * The source face handle. + * + * id :: + * A string describing the service as defined in the service's + * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to + * `multi-masters'). It is automatically prefixed with + * `FT_SERVICE_ID_'. + * + * @output: + * ptr :: + * A variable that receives the service pointer. Will be NULL + * if not found. + */ +#ifdef __cplusplus + +#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_; \ + FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \ + \ + \ + _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ + *_pptr_ = _tmp_; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \ + FT_Pointer _tmp_; \ + \ + \ + _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \ + ptr = _tmp_; \ + FT_END_STMNT + +#endif /* !C++ */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S E R V I C E D E S C R I P T O R S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The following structure is used to _describe_ a given service + * to the library. This is useful to build simple static service lists. + */ + typedef struct FT_ServiceDescRec_ + { + const char* serv_id; /* service name */ + const void* serv_data; /* service pointer/data */ + + } FT_ServiceDescRec; + + typedef const FT_ServiceDescRec* FT_ServiceDesc; + + + /* + * Parse a list of FT_ServiceDescRec descriptors and look for + * a specific service by ID. Note that the last element in the + * array must be { NULL, NULL }, and that the function should + * return NULL if the service isn't available. + * + * This function can be used by modules to implement their + * `get_service' method. + */ + FT_BASE( FT_Pointer ) + ft_service_list_lookup( FT_ServiceDesc service_descriptors, + const char* service_id ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S E R V I C E S C A C H E *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * This structure is used to store a cache for several frequently used + * services. It is the type of `face->internal->services'. You + * should only use FT_FACE_LOOKUP_SERVICE to access it. + * + * All fields should have the type FT_Pointer to relax compilation + * dependencies. We assume the developer isn't completely stupid. + * + * Each field must be named `service_XXXX' where `XXX' corresponds to + * the correct FT_SERVICE_ID_XXXX macro. See the definition of + * FT_FACE_LOOKUP_SERVICE below how this is implemented. + * + */ + typedef struct FT_ServiceCacheRec_ + { + FT_Pointer service_POSTSCRIPT_FONT_NAME; + FT_Pointer service_MULTI_MASTERS; + FT_Pointer service_GLYPH_DICT; + FT_Pointer service_PFR_METRICS; + FT_Pointer service_WINFNT; + + } FT_ServiceCacheRec, *FT_ServiceCache; + + + /* + * A magic number used within the services cache. + */ +#define FT_SERVICE_UNAVAILABLE ((FT_Pointer)-2) /* magic number */ + + + /* + * @macro: + * FT_FACE_LOOKUP_SERVICE + * + * @description: + * This macro is used to lookup a service from a face's driver module + * using its cache. + * + * @input: + * face:: + * The source face handle containing the cache. + * + * field :: + * The field name in the cache. + * + * id :: + * The service ID. + * + * @output: + * ptr :: + * A variable receiving the service data. NULL if not available. + */ +#ifdef __cplusplus + +#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Pointer svc; \ + FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \ + \ + \ + svc = FT_FACE( face )->internal->services. service_ ## id; \ + if ( svc == FT_SERVICE_UNAVAILABLE ) \ + svc = NULL; \ + else if ( svc == NULL ) \ + { \ + FT_FACE_FIND_SERVICE( face, svc, id ); \ + \ + FT_FACE( face )->internal->services. service_ ## id = \ + (FT_Pointer)( svc != NULL ? svc \ + : FT_SERVICE_UNAVAILABLE ); \ + } \ + *Pptr = svc; \ + FT_END_STMNT + +#else /* !C++ */ + +#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \ + FT_BEGIN_STMNT \ + FT_Pointer svc; \ + \ + \ + svc = FT_FACE( face )->internal->services. service_ ## id; \ + if ( svc == FT_SERVICE_UNAVAILABLE ) \ + svc = NULL; \ + else if ( svc == NULL ) \ + { \ + FT_FACE_FIND_SERVICE( face, svc, id ); \ + \ + FT_FACE( face )->internal->services. service_ ## id = \ + (FT_Pointer)( svc != NULL ? svc \ + : FT_SERVICE_UNAVAILABLE ); \ + } \ + ptr = svc; \ + FT_END_STMNT + +#endif /* !C++ */ + + /* + * A macro used to define new service structure types. + */ + +#define FT_DEFINE_SERVICE( name ) \ + typedef struct FT_Service_ ## name ## Rec_ \ + FT_Service_ ## name ## Rec ; \ + typedef struct FT_Service_ ## name ## Rec_ \ + const * FT_Service_ ## name ; \ + struct FT_Service_ ## name ## Rec_ + + /* */ + + /* + * The header files containing the services. + */ + +#define FT_SERVICE_BDF_H <freetype/internal/services/svbdf.h> +#define FT_SERVICE_GLYPH_DICT_H <freetype/internal/services/svgldict.h> +#define FT_SERVICE_GX_VALIDATE_H <freetype/internal/services/svgxval.h> +#define FT_SERVICE_KERNING_H <freetype/internal/services/svkern.h> +#define FT_SERVICE_MULTIPLE_MASTERS_H <freetype/internal/services/svmm.h> +#define FT_SERVICE_OPENTYPE_VALIDATE_H <freetype/internal/services/svotval.h> +#define FT_SERVICE_PFR_H <freetype/internal/services/svpfr.h> +#define FT_SERVICE_POSTSCRIPT_CMAPS_H <freetype/internal/services/svpscmap.h> +#define FT_SERVICE_POSTSCRIPT_INFO_H <freetype/internal/services/svpsinfo.h> +#define FT_SERVICE_POSTSCRIPT_NAME_H <freetype/internal/services/svpostnm.h> +#define FT_SERVICE_SFNT_H <freetype/internal/services/svsfnt.h> +#define FT_SERVICE_TRUETYPE_ENGINE_H <freetype/internal/services/svtteng.h> +#define FT_SERVICE_TT_CMAP_H <freetype/internal/services/svttcmap.h> +#define FT_SERVICE_WINFNT_H <freetype/internal/services/svwinfnt.h> +#define FT_SERVICE_XFREE86_NAME_H <freetype/internal/services/svxf86nm.h> +#define FT_SERVICE_TRUETYPE_GLYF_H <freetype/internal/services/svttglyf.h> + + /* */ + +FT_END_HEADER + +#endif /* __FTSERV_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/ftstream.h b/libIGraph/include/freetype/internal/ftstream.h new file mode 100644 index 0000000..973a2c8 --- /dev/null +++ b/libIGraph/include/freetype/internal/ftstream.h @@ -0,0 +1,539 @@ +/***************************************************************************/ +/* */ +/* ftstream.h */ +/* */ +/* Stream handling (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTSTREAM_H__ +#define __FTSTREAM_H__ + + +#include <ft2build.h> +#include FT_SYSTEM_H +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /* format of an 8-bit frame_op value: */ + /* */ + /* bit 76543210 */ + /* xxxxxxes */ + /* */ + /* s is set to 1 if the value is signed. */ + /* e is set to 1 if the value is little-endian. */ + /* xxx is a command. */ + +#define FT_FRAME_OP_SHIFT 2 +#define FT_FRAME_OP_SIGNED 1 +#define FT_FRAME_OP_LITTLE 2 +#define FT_FRAME_OP_COMMAND( x ) ( x >> FT_FRAME_OP_SHIFT ) + +#define FT_MAKE_FRAME_OP( command, little, sign ) \ + ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign ) + +#define FT_FRAME_OP_END 0 +#define FT_FRAME_OP_START 1 /* start a new frame */ +#define FT_FRAME_OP_BYTE 2 /* read 1-byte value */ +#define FT_FRAME_OP_SHORT 3 /* read 2-byte value */ +#define FT_FRAME_OP_LONG 4 /* read 4-byte value */ +#define FT_FRAME_OP_OFF3 5 /* read 3-byte value */ +#define FT_FRAME_OP_BYTES 6 /* read a bytes sequence */ + + + typedef enum FT_Frame_Op_ + { + ft_frame_end = 0, + ft_frame_start = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ), + + ft_frame_byte = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 0 ), + ft_frame_schar = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 1 ), + + ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ), + ft_frame_short_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ), + ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ), + ft_frame_short_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ), + + ft_frame_ulong_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ), + ft_frame_long_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ), + ft_frame_ulong_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ), + ft_frame_long_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ), + + ft_frame_uoff3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ), + ft_frame_off3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ), + ft_frame_uoff3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ), + ft_frame_off3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ), + + ft_frame_bytes = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ), + ft_frame_skip = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 ) + + } FT_Frame_Op; + + + typedef struct FT_Frame_Field_ + { + FT_Byte value; + FT_Byte size; + FT_UShort offset; + + } FT_Frame_Field; + + + /* Construct an FT_Frame_Field out of a structure type and a field name. */ + /* The structure type must be set in the FT_STRUCTURE macro before */ + /* calling the FT_FRAME_START() macro. */ + /* */ +#define FT_FIELD_SIZE( f ) \ + (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f ) + +#define FT_FIELD_SIZE_DELTA( f ) \ + (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] ) + +#define FT_FIELD_OFFSET( f ) \ + (FT_UShort)( offsetof( FT_STRUCTURE, f ) ) + +#define FT_FRAME_FIELD( frame_op, field ) \ + { \ + frame_op, \ + FT_FIELD_SIZE( field ), \ + FT_FIELD_OFFSET( field ) \ + } + +#define FT_MAKE_EMPTY_FIELD( frame_op ) { frame_op, 0, 0 } + +#define FT_FRAME_START( size ) { ft_frame_start, 0, size } +#define FT_FRAME_END { ft_frame_end, 0, 0 } + +#define FT_FRAME_LONG( f ) FT_FRAME_FIELD( ft_frame_long_be, f ) +#define FT_FRAME_ULONG( f ) FT_FRAME_FIELD( ft_frame_ulong_be, f ) +#define FT_FRAME_SHORT( f ) FT_FRAME_FIELD( ft_frame_short_be, f ) +#define FT_FRAME_USHORT( f ) FT_FRAME_FIELD( ft_frame_ushort_be, f ) +#define FT_FRAME_OFF3( f ) FT_FRAME_FIELD( ft_frame_off3_be, f ) +#define FT_FRAME_UOFF3( f ) FT_FRAME_FIELD( ft_frame_uoff3_be, f ) +#define FT_FRAME_BYTE( f ) FT_FRAME_FIELD( ft_frame_byte, f ) +#define FT_FRAME_CHAR( f ) FT_FRAME_FIELD( ft_frame_schar, f ) + +#define FT_FRAME_LONG_LE( f ) FT_FRAME_FIELD( ft_frame_long_le, f ) +#define FT_FRAME_ULONG_LE( f ) FT_FRAME_FIELD( ft_frame_ulong_le, f ) +#define FT_FRAME_SHORT_LE( f ) FT_FRAME_FIELD( ft_frame_short_le, f ) +#define FT_FRAME_USHORT_LE( f ) FT_FRAME_FIELD( ft_frame_ushort_le, f ) +#define FT_FRAME_OFF3_LE( f ) FT_FRAME_FIELD( ft_frame_off3_le, f ) +#define FT_FRAME_UOFF3_LE( f ) FT_FRAME_FIELD( ft_frame_uoff3_le, f ) + +#define FT_FRAME_SKIP_LONG { ft_frame_long_be, 0, 0 } +#define FT_FRAME_SKIP_SHORT { ft_frame_short_be, 0, 0 } +#define FT_FRAME_SKIP_BYTE { ft_frame_byte, 0, 0 } + +#define FT_FRAME_BYTES( field, count ) \ + { \ + ft_frame_bytes, \ + count, \ + FT_FIELD_OFFSET( field ) \ + } + +#define FT_FRAME_SKIP_BYTES( count ) { ft_frame_skip, count, 0 } + + + /*************************************************************************/ + /* */ + /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */ + /* type `char*' or equivalent (1-byte elements). */ + /* */ + +#define FT_BYTE_( p, i ) ( ((const FT_Byte*)(p))[(i)] ) +#define FT_INT8_( p, i ) ( ((const FT_Char*)(p))[(i)] ) + +#define FT_INT16( x ) ( (FT_Int16)(x) ) +#define FT_UINT16( x ) ( (FT_UInt16)(x) ) +#define FT_INT32( x ) ( (FT_Int32)(x) ) +#define FT_UINT32( x ) ( (FT_UInt32)(x) ) + +#define FT_BYTE_I16( p, i, s ) ( FT_INT16( FT_BYTE_( p, i ) ) << (s) ) +#define FT_BYTE_U16( p, i, s ) ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) ) +#define FT_BYTE_I32( p, i, s ) ( FT_INT32( FT_BYTE_( p, i ) ) << (s) ) +#define FT_BYTE_U32( p, i, s ) ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) ) + +#define FT_INT8_I16( p, i, s ) ( FT_INT16( FT_INT8_( p, i ) ) << (s) ) +#define FT_INT8_U16( p, i, s ) ( FT_UINT16( FT_INT8_( p, i ) ) << (s) ) +#define FT_INT8_I32( p, i, s ) ( FT_INT32( FT_INT8_( p, i ) ) << (s) ) +#define FT_INT8_U32( p, i, s ) ( FT_UINT32( FT_INT8_( p, i ) ) << (s) ) + + +#define FT_PEEK_SHORT( p ) FT_INT16( FT_INT8_I16( p, 0, 8) | \ + FT_BYTE_I16( p, 1, 0) ) + +#define FT_PEEK_USHORT( p ) FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \ + FT_BYTE_U16( p, 1, 0 ) ) + +#define FT_PEEK_LONG( p ) FT_INT32( FT_INT8_I32( p, 0, 24 ) | \ + FT_BYTE_I32( p, 1, 16 ) | \ + FT_BYTE_I32( p, 2, 8 ) | \ + FT_BYTE_I32( p, 3, 0 ) ) + +#define FT_PEEK_ULONG( p ) FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \ + FT_BYTE_U32( p, 1, 16 ) | \ + FT_BYTE_U32( p, 2, 8 ) | \ + FT_BYTE_U32( p, 3, 0 ) ) + +#define FT_PEEK_OFF3( p ) FT_INT32( FT_INT8_I32( p, 0, 16 ) | \ + FT_BYTE_I32( p, 1, 8 ) | \ + FT_BYTE_I32( p, 2, 0 ) ) + +#define FT_PEEK_UOFF3( p ) FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 2, 0 ) ) + +#define FT_PEEK_SHORT_LE( p ) FT_INT16( FT_INT8_I16( p, 1, 8 ) | \ + FT_BYTE_I16( p, 0, 0 ) ) + +#define FT_PEEK_USHORT_LE( p ) FT_UINT16( FT_BYTE_U16( p, 1, 8 ) | \ + FT_BYTE_U16( p, 0, 0 ) ) + +#define FT_PEEK_LONG_LE( p ) FT_INT32( FT_INT8_I32( p, 3, 24 ) | \ + FT_BYTE_I32( p, 2, 16 ) | \ + FT_BYTE_I32( p, 1, 8 ) | \ + FT_BYTE_I32( p, 0, 0 ) ) + +#define FT_PEEK_ULONG_LE( p ) FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \ + FT_BYTE_U32( p, 2, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 0, 0 ) ) + +#define FT_PEEK_OFF3_LE( p ) FT_INT32( FT_INT8_I32( p, 2, 16 ) | \ + FT_BYTE_I32( p, 1, 8 ) | \ + FT_BYTE_I32( p, 0, 0 ) ) + +#define FT_PEEK_UOFF3_LE( p ) FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \ + FT_BYTE_U32( p, 1, 8 ) | \ + FT_BYTE_U32( p, 0, 0 ) ) + + +#define FT_NEXT_CHAR( buffer ) \ + ( (signed char)*buffer++ ) + +#define FT_NEXT_BYTE( buffer ) \ + ( (unsigned char)*buffer++ ) + +#define FT_NEXT_SHORT( buffer ) \ + ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) ) + +#define FT_NEXT_USHORT( buffer ) \ + ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) ) + +#define FT_NEXT_OFF3( buffer ) \ + ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) ) + +#define FT_NEXT_UOFF3( buffer ) \ + ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) ) + +#define FT_NEXT_LONG( buffer ) \ + ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) ) + +#define FT_NEXT_ULONG( buffer ) \ + ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) ) + + +#define FT_NEXT_SHORT_LE( buffer ) \ + ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) ) + +#define FT_NEXT_USHORT_LE( buffer ) \ + ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) ) + +#define FT_NEXT_OFF3_LE( buffer ) \ + ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) ) + +#define FT_NEXT_UOFF3_LE( buffer ) \ + ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) ) + +#define FT_NEXT_LONG_LE( buffer ) \ + ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) ) + +#define FT_NEXT_ULONG_LE( buffer ) \ + ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) ) + + + /*************************************************************************/ + /* */ + /* Each GET_xxxx() macro uses an implicit `stream' variable. */ + /* */ +#if 0 +#define FT_GET_MACRO( type ) FT_NEXT_ ## type ( stream->cursor ) + +#define FT_GET_CHAR() FT_GET_MACRO( CHAR ) +#define FT_GET_BYTE() FT_GET_MACRO( BYTE ) +#define FT_GET_SHORT() FT_GET_MACRO( SHORT ) +#define FT_GET_USHORT() FT_GET_MACRO( USHORT ) +#define FT_GET_OFF3() FT_GET_MACRO( OFF3 ) +#define FT_GET_UOFF3() FT_GET_MACRO( UOFF3 ) +#define FT_GET_LONG() FT_GET_MACRO( LONG ) +#define FT_GET_ULONG() FT_GET_MACRO( ULONG ) +#define FT_GET_TAG4() FT_GET_MACRO( ULONG ) + +#define FT_GET_SHORT_LE() FT_GET_MACRO( SHORT_LE ) +#define FT_GET_USHORT_LE() FT_GET_MACRO( USHORT_LE ) +#define FT_GET_LONG_LE() FT_GET_MACRO( LONG_LE ) +#define FT_GET_ULONG_LE() FT_GET_MACRO( ULONG_LE ) + +#else +#define FT_GET_MACRO( func, type ) ( (type)func( stream ) ) + +#define FT_GET_CHAR() FT_GET_MACRO( FT_Stream_GetChar, FT_Char ) +#define FT_GET_BYTE() FT_GET_MACRO( FT_Stream_GetChar, FT_Byte ) +#define FT_GET_SHORT() FT_GET_MACRO( FT_Stream_GetShort, FT_Short ) +#define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetShort, FT_UShort ) +#define FT_GET_OFF3() FT_GET_MACRO( FT_Stream_GetOffset, FT_Long ) +#define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetOffset, FT_ULong ) +#define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetLong, FT_Long ) +#define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetLong, FT_ULong ) +#define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetLong, FT_ULong ) + +#define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetShortLE, FT_Short ) +#define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetShortLE, FT_UShort ) +#define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetLongLE, FT_Long ) +#define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetLongLE, FT_ULong ) +#endif + +#define FT_READ_MACRO( func, type, var ) \ + ( var = (type)func( stream, &error ), \ + error != FT_Err_Ok ) + +#define FT_READ_BYTE( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var ) +#define FT_READ_CHAR( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var ) +#define FT_READ_SHORT( var ) FT_READ_MACRO( FT_Stream_ReadShort, FT_Short, var ) +#define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadShort, FT_UShort, var ) +#define FT_READ_OFF3( var ) FT_READ_MACRO( FT_Stream_ReadOffset, FT_Long, var ) +#define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadOffset, FT_ULong, var ) +#define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadLong, FT_Long, var ) +#define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadLong, FT_ULong, var ) + +#define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadShortLE, FT_Short, var ) +#define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadShortLE, FT_UShort, var ) +#define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadLongLE, FT_Long, var ) +#define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadLongLE, FT_ULong, var ) + + +#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM + + /* initialize a stream for reading a regular system stream */ + FT_BASE( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ); + +#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */ + + + /* create a new (input) stream from an FT_Open_Args structure */ + FT_BASE( FT_Error ) + FT_Stream_New( FT_Library library, + const FT_Open_Args* args, + FT_Stream *astream ); + + /* free a stream */ + FT_BASE( void ) + FT_Stream_Free( FT_Stream stream, + FT_Int external ); + + /* initialize a stream for reading in-memory data */ + FT_BASE( void ) + FT_Stream_OpenMemory( FT_Stream stream, + const FT_Byte* base, + FT_ULong size ); + + /* close a stream (does not destroy the stream structure) */ + FT_BASE( void ) + FT_Stream_Close( FT_Stream stream ); + + + /* seek within a stream. position is relative to start of stream */ + FT_BASE( FT_Error ) + FT_Stream_Seek( FT_Stream stream, + FT_ULong pos ); + + /* skip bytes in a stream */ + FT_BASE( FT_Error ) + FT_Stream_Skip( FT_Stream stream, + FT_Long distance ); + + /* return current stream position */ + FT_BASE( FT_Long ) + FT_Stream_Pos( FT_Stream stream ); + + /* read bytes from a stream into a user-allocated buffer, returns an */ + /* error if not all bytes could be read. */ + FT_BASE( FT_Error ) + FT_Stream_Read( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ); + + /* read bytes from a stream at a given position */ + FT_BASE( FT_Error ) + FT_Stream_ReadAt( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ); + + /* try to read bytes at the end of a stream; return number of bytes */ + /* really available */ + FT_BASE( FT_ULong ) + FT_Stream_TryRead( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ); + + /* Enter a frame of `count' consecutive bytes in a stream. Returns an */ + /* error if the frame could not be read/accessed. The caller can use */ + /* the FT_Stream_Get_XXX functions to retrieve frame data without */ + /* error checks. */ + /* */ + /* You must _always_ call FT_Stream_ExitFrame() once you have entered */ + /* a stream frame! */ + /* */ + FT_BASE( FT_Error ) + FT_Stream_EnterFrame( FT_Stream stream, + FT_ULong count ); + + /* exit a stream frame */ + FT_BASE( void ) + FT_Stream_ExitFrame( FT_Stream stream ); + + /* Extract a stream frame. If the stream is disk-based, a heap block */ + /* is allocated and the frame bytes are read into it. If the stream */ + /* is memory-based, this function simply set a pointer to the data. */ + /* */ + /* Useful to optimize access to memory-based streams transparently. */ + /* */ + /* All extracted frames must be `freed' with a call to the function */ + /* FT_Stream_ReleaseFrame(). */ + /* */ + FT_BASE( FT_Error ) + FT_Stream_ExtractFrame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ); + + /* release an extract frame (see FT_Stream_ExtractFrame) */ + FT_BASE( void ) + FT_Stream_ReleaseFrame( FT_Stream stream, + FT_Byte** pbytes ); + + /* read a byte from an entered frame */ + FT_BASE( FT_Char ) + FT_Stream_GetChar( FT_Stream stream ); + + /* read a 16-bit big-endian integer from an entered frame */ + FT_BASE( FT_Short ) + FT_Stream_GetShort( FT_Stream stream ); + + /* read a 24-bit big-endian integer from an entered frame */ + FT_BASE( FT_Long ) + FT_Stream_GetOffset( FT_Stream stream ); + + /* read a 32-bit big-endian integer from an entered frame */ + FT_BASE( FT_Long ) + FT_Stream_GetLong( FT_Stream stream ); + + /* read a 16-bit little-endian integer from an entered frame */ + FT_BASE( FT_Short ) + FT_Stream_GetShortLE( FT_Stream stream ); + + /* read a 32-bit little-endian integer from an entered frame */ + FT_BASE( FT_Long ) + FT_Stream_GetLongLE( FT_Stream stream ); + + + /* read a byte from a stream */ + FT_BASE( FT_Char ) + FT_Stream_ReadChar( FT_Stream stream, + FT_Error* error ); + + /* read a 16-bit big-endian integer from a stream */ + FT_BASE( FT_Short ) + FT_Stream_ReadShort( FT_Stream stream, + FT_Error* error ); + + /* read a 24-bit big-endian integer from a stream */ + FT_BASE( FT_Long ) + FT_Stream_ReadOffset( FT_Stream stream, + FT_Error* error ); + + /* read a 32-bit big-endian integer from a stream */ + FT_BASE( FT_Long ) + FT_Stream_ReadLong( FT_Stream stream, + FT_Error* error ); + + /* read a 16-bit little-endian integer from a stream */ + FT_BASE( FT_Short ) + FT_Stream_ReadShortLE( FT_Stream stream, + FT_Error* error ); + + /* read a 32-bit little-endian integer from a stream */ + FT_BASE( FT_Long ) + FT_Stream_ReadLongLE( FT_Stream stream, + FT_Error* error ); + + /* Read a structure from a stream. The structure must be described */ + /* by an array of FT_Frame_Field records. */ + FT_BASE( FT_Error ) + FT_Stream_ReadFields( FT_Stream stream, + const FT_Frame_Field* fields, + void* structure ); + + +#define FT_STREAM_POS() \ + FT_Stream_Pos( stream ) + +#define FT_STREAM_SEEK( position ) \ + FT_SET_ERROR( FT_Stream_Seek( stream, position ) ) + +#define FT_STREAM_SKIP( distance ) \ + FT_SET_ERROR( FT_Stream_Skip( stream, distance ) ) + +#define FT_STREAM_READ( buffer, count ) \ + FT_SET_ERROR( FT_Stream_Read( stream, \ + (FT_Byte*)buffer, \ + count ) ) + +#define FT_STREAM_READ_AT( position, buffer, count ) \ + FT_SET_ERROR( FT_Stream_ReadAt( stream, \ + position, \ + (FT_Byte*)buffer, \ + count ) ) + +#define FT_STREAM_READ_FIELDS( fields, object ) \ + FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) ) + + +#define FT_FRAME_ENTER( size ) \ + FT_SET_ERROR( \ + FT_DEBUG_INNER( FT_Stream_EnterFrame( stream, size ) ) ) + +#define FT_FRAME_EXIT() \ + FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) ) + +#define FT_FRAME_EXTRACT( size, bytes ) \ + FT_SET_ERROR( \ + FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream, size, \ + (FT_Byte**)&(bytes) ) ) ) + +#define FT_FRAME_RELEASE( bytes ) \ + FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream, \ + (FT_Byte**)&(bytes) ) ) + + +FT_END_HEADER + +#endif /* __FTSTREAM_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/fttrace.h b/libIGraph/include/freetype/internal/fttrace.h new file mode 100644 index 0000000..82d0ed9 --- /dev/null +++ b/libIGraph/include/freetype/internal/fttrace.h @@ -0,0 +1,133 @@ +/***************************************************************************/ +/* */ +/* fttrace.h */ +/* */ +/* Tracing handling (specification only). */ +/* */ +/* Copyright 2002, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /* definitions of trace levels for FreeType 2 */ + + /* the first level must always be `trace_any' */ +FT_TRACE_DEF( any ) + + /* base components */ +FT_TRACE_DEF( calc ) /* calculations (ftcalc.c) */ +FT_TRACE_DEF( memory ) /* memory manager (ftobjs.c) */ +FT_TRACE_DEF( stream ) /* stream manager (ftstream.c) */ +FT_TRACE_DEF( io ) /* i/o interface (ftsystem.c) */ +FT_TRACE_DEF( list ) /* list management (ftlist.c) */ +FT_TRACE_DEF( init ) /* initialization (ftinit.c) */ +FT_TRACE_DEF( objs ) /* base objects (ftobjs.c) */ +FT_TRACE_DEF( outline ) /* outline management (ftoutln.c) */ +FT_TRACE_DEF( glyph ) /* glyph management (ftglyph.c) */ + +FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */ +FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */ +FT_TRACE_DEF( mm ) /* MM interface (ftmm.c) */ +FT_TRACE_DEF( raccess ) /* resource fork accessor (ftrfork.c) */ + + /* Cache sub-system */ +FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */ + + /* SFNT driver components */ +FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */ +FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */ +FT_TRACE_DEF( ttkern ) /* kerning handler (ttkern.c) */ +FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */ +FT_TRACE_DEF( ttmtx ) /* metrics-related tables (ttmtx.c) */ +FT_TRACE_DEF( ttpost ) /* PS table processing (ttpost.c) */ +FT_TRACE_DEF( ttsbit ) /* TrueType sbit handling (ttsbit.c) */ + + /* TrueType driver components */ +FT_TRACE_DEF( ttdriver ) /* TT font driver (ttdriver.c) */ +FT_TRACE_DEF( ttgload ) /* TT glyph loader (ttgload.c) */ +FT_TRACE_DEF( ttinterp ) /* bytecode interpreter (ttinterp.c) */ +FT_TRACE_DEF( ttobjs ) /* TT objects manager (ttobjs.c) */ +FT_TRACE_DEF( ttpload ) /* TT data/program loader (ttpload.c) */ +FT_TRACE_DEF( ttgxvar ) /* TrueType GX var handler (ttgxvar.c) */ + + /* Type 1 driver components */ +FT_TRACE_DEF( t1driver ) +FT_TRACE_DEF( t1gload ) +FT_TRACE_DEF( t1hint ) +FT_TRACE_DEF( t1load ) +FT_TRACE_DEF( t1objs ) +FT_TRACE_DEF( t1parse ) + + /* PostScript helper module `psaux' */ +FT_TRACE_DEF( t1decode ) +FT_TRACE_DEF( psobjs ) + + /* PostScript hinting module `pshinter' */ +FT_TRACE_DEF( pshrec ) +FT_TRACE_DEF( pshalgo1 ) +FT_TRACE_DEF( pshalgo2 ) + + /* Type 2 driver components */ +FT_TRACE_DEF( cffdriver ) +FT_TRACE_DEF( cffgload ) +FT_TRACE_DEF( cffload ) +FT_TRACE_DEF( cffobjs ) +FT_TRACE_DEF( cffparse ) + + /* Type 42 driver component */ +FT_TRACE_DEF( t42 ) + + /* CID driver components */ +FT_TRACE_DEF( cidafm ) +FT_TRACE_DEF( ciddriver ) +FT_TRACE_DEF( cidgload ) +FT_TRACE_DEF( cidload ) +FT_TRACE_DEF( cidobjs ) +FT_TRACE_DEF( cidparse ) + + /* Windows font component */ +FT_TRACE_DEF( winfnt ) + + /* PCF font components */ +FT_TRACE_DEF( pcfdriver ) +FT_TRACE_DEF( pcfread ) + + /* BDF font components */ +FT_TRACE_DEF( bdfdriver ) +FT_TRACE_DEF( bdflib ) + + /* PFR font component */ +FT_TRACE_DEF( pfr ) + + /* OpenType validation components */ +FT_TRACE_DEF( otvmodule ) +FT_TRACE_DEF( otvcommon ) +FT_TRACE_DEF( otvbase ) +FT_TRACE_DEF( otvgdef ) +FT_TRACE_DEF( otvgpos ) +FT_TRACE_DEF( otvgsub ) +FT_TRACE_DEF( otvjstf ) + + /* TrueTypeGX/AAT validation components */ +FT_TRACE_DEF( gxvmodule ) +FT_TRACE_DEF( gxvcommon ) +FT_TRACE_DEF( gxvfeat ) +FT_TRACE_DEF( gxvmort ) +FT_TRACE_DEF( gxvmorx ) +FT_TRACE_DEF( gxvbsln ) +FT_TRACE_DEF( gxvjust ) +FT_TRACE_DEF( gxvkern ) +FT_TRACE_DEF( gxvopbd ) +FT_TRACE_DEF( gxvtrak ) +FT_TRACE_DEF( gxvprop ) +FT_TRACE_DEF( gxvlcar ) + + +/* END */ diff --git a/libIGraph/include/freetype/internal/ftvalid.h b/libIGraph/include/freetype/internal/ftvalid.h new file mode 100644 index 0000000..4446b62 --- /dev/null +++ b/libIGraph/include/freetype/internal/ftvalid.h @@ -0,0 +1,150 @@ +/***************************************************************************/ +/* */ +/* ftvalid.h */ +/* */ +/* FreeType validation support (specification). */ +/* */ +/* Copyright 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __FTVALID_H__ +#define __FTVALID_H__ + +#include <ft2build.h> +#include FT_CONFIG_STANDARD_LIBRARY_H /* for ft_setjmp and ft_longjmp */ + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** V A L I D A T I O N ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to a validation object */ + typedef struct FT_ValidatorRec_ volatile* FT_Validator; + + + /*************************************************************************/ + /* */ + /* There are three distinct validation levels defined here: */ + /* */ + /* FT_VALIDATE_DEFAULT :: */ + /* A table that passes this validation level can be used reliably by */ + /* FreeType. It generally means that all offsets have been checked to */ + /* prevent out-of-bound reads, that array counts are correct, etc. */ + /* */ + /* FT_VALIDATE_TIGHT :: */ + /* A table that passes this validation level can be used reliably and */ + /* doesn't contain invalid data. For example, a charmap table that */ + /* returns invalid glyph indices will not pass, even though it can */ + /* be used with FreeType in default mode (the library will simply */ + /* return an error later when trying to load the glyph). */ + /* */ + /* It also checks that fields which must be a multiple of 2, 4, or 8, */ + /* don't have incorrect values, etc. */ + /* */ + /* FT_VALIDATE_PARANOID :: */ + /* Only for font debugging. Checks that a table follows the */ + /* specification by 100%. Very few fonts will be able to pass this */ + /* level anyway but it can be useful for certain tools like font */ + /* editors/converters. */ + /* */ + typedef enum FT_ValidationLevel_ + { + FT_VALIDATE_DEFAULT = 0, + FT_VALIDATE_TIGHT, + FT_VALIDATE_PARANOID + + } FT_ValidationLevel; + + + /* validator structure */ + typedef struct FT_ValidatorRec_ + { + const FT_Byte* base; /* address of table in memory */ + const FT_Byte* limit; /* `base' + sizeof(table) in memory */ + FT_ValidationLevel level; /* validation level */ + FT_Error error; /* error returned. 0 means success */ + + ft_jmp_buf jump_buffer; /* used for exception handling */ + + } FT_ValidatorRec; + + +#define FT_VALIDATOR( x ) ((FT_Validator)( x )) + + + FT_BASE( void ) + ft_validator_init( FT_Validator valid, + const FT_Byte* base, + const FT_Byte* limit, + FT_ValidationLevel level ); + + /* Do not use this. It's broken and will cause your validator to crash */ + /* if you run it on an invalid font. */ + FT_BASE( FT_Int ) + ft_validator_run( FT_Validator valid ); + + /* Sets the error field in a validator, then calls `longjmp' to return */ + /* to high-level caller. Using `setjmp/longjmp' avoids many stupid */ + /* error checks within the validation routines. */ + /* */ + FT_BASE( void ) + ft_validator_error( FT_Validator valid, + FT_Error error ); + + + /* Calls ft_validate_error. Assumes that the `valid' local variable */ + /* holds a pointer to the current validator object. */ + /* */ + /* Use preprocessor prescan to pass FT_ERR_PREFIX. */ + /* */ +#define FT_INVALID( _prefix, _error ) FT_INVALID_( _prefix, _error ) +#define FT_INVALID_( _prefix, _error ) \ + ft_validator_error( valid, _prefix ## _error ) + + /* called when a broken table is detected */ +#define FT_INVALID_TOO_SHORT \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Table ) + + /* called when an invalid offset is detected */ +#define FT_INVALID_OFFSET \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Offset ) + + /* called when an invalid format/value is detected */ +#define FT_INVALID_FORMAT \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Table ) + + /* called when an invalid glyph index is detected */ +#define FT_INVALID_GLYPH_ID \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Glyph_Index ) + + /* called when an invalid field value is detected */ +#define FT_INVALID_DATA \ + FT_INVALID( FT_ERR_PREFIX, Invalid_Table ) + + +FT_END_HEADER + +#endif /* __FTVALID_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/internal.h b/libIGraph/include/freetype/internal/internal.h new file mode 100644 index 0000000..ea10dd8 --- /dev/null +++ b/libIGraph/include/freetype/internal/internal.h @@ -0,0 +1,50 @@ +/***************************************************************************/ +/* */ +/* internal.h */ +/* */ +/* Internal header files (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file is automatically included by `ft2build.h'. */ + /* Do not include it manually! */ + /* */ + /*************************************************************************/ + + +#define FT_INTERNAL_OBJECTS_H <freetype/internal/ftobjs.h> +#define FT_INTERNAL_STREAM_H <freetype/internal/ftstream.h> +#define FT_INTERNAL_MEMORY_H <freetype/internal/ftmemory.h> +#define FT_INTERNAL_DEBUG_H <freetype/internal/ftdebug.h> +#define FT_INTERNAL_CALC_H <freetype/internal/ftcalc.h> +#define FT_INTERNAL_DRIVER_H <freetype/internal/ftdriver.h> +#define FT_INTERNAL_TRACE_H <freetype/internal/fttrace.h> +#define FT_INTERNAL_GLYPH_LOADER_H <freetype/internal/ftgloadr.h> +#define FT_INTERNAL_SFNT_H <freetype/internal/sfnt.h> +#define FT_INTERNAL_SERVICE_H <freetype/internal/ftserv.h> +#define FT_INTERNAL_RFORK_H <freetype/internal/ftrfork.h> +#define FT_INTERNAL_VALIDATE_H <freetype/internal/ftvalid.h> + +#define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h> +#define FT_INTERNAL_TYPE1_TYPES_H <freetype/internal/t1types.h> + +#define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h> +#define FT_INTERNAL_POSTSCRIPT_HINTS_H <freetype/internal/pshints.h> +#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H <freetype/internal/psglobal.h> + +#define FT_INTERNAL_AUTOHINT_H <freetype/internal/autohint.h> + + +/* END */ diff --git a/libIGraph/include/freetype/internal/pcftypes.h b/libIGraph/include/freetype/internal/pcftypes.h new file mode 100644 index 0000000..d7d6d53 --- /dev/null +++ b/libIGraph/include/freetype/internal/pcftypes.h @@ -0,0 +1,56 @@ +/* pcftypes.h + + FreeType font driver for pcf fonts + + Copyright (C) 2000, 2001, 2002 by + Francesco Zappa Nardelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + + +#ifndef __PCFTYPES_H__ +#define __PCFTYPES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + typedef struct PCF_Public_FaceRec_ + { + FT_FaceRec root; + FT_StreamRec gzip_stream; + FT_Stream gzip_source; + + char* charset_encoding; + char* charset_registry; + + } PCF_Public_FaceRec, *PCF_Public_Face; + + +FT_END_HEADER + +#endif /* __PCFTYPES_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/psaux.h b/libIGraph/include/freetype/internal/psaux.h new file mode 100644 index 0000000..8c0055c --- /dev/null +++ b/libIGraph/include/freetype/internal/psaux.h @@ -0,0 +1,879 @@ +/***************************************************************************/ +/* */ +/* psaux.h */ +/* */ +/* Auxiliary functions and data structures related to PostScript fonts */ +/* (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSAUX_H__ +#define __PSAUX_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_TYPE1_TYPES_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct PS_TableRec_* PS_Table; + typedef const struct PS_Table_FuncsRec_* PS_Table_Funcs; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_Table_FuncsRec */ + /* */ + /* <Description> */ + /* A set of function pointers to manage PS_Table objects. */ + /* */ + /* <Fields> */ + /* table_init :: Used to initialize a table. */ + /* */ + /* table_done :: Finalizes resp. destroy a given table. */ + /* */ + /* table_add :: Adds a new object to a table. */ + /* */ + /* table_release :: Releases table data, then finalizes it. */ + /* */ + typedef struct PS_Table_FuncsRec_ + { + FT_Error + (*init)( PS_Table table, + FT_Int count, + FT_Memory memory ); + + void + (*done)( PS_Table table ); + + FT_Error + (*add)( PS_Table table, + FT_Int idx, + void* object, + FT_PtrDist length ); + + void + (*release)( PS_Table table ); + + } PS_Table_FuncsRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_TableRec */ + /* */ + /* <Description> */ + /* A PS_Table is a simple object used to store an array of objects in */ + /* a single memory block. */ + /* */ + /* <Fields> */ + /* block :: The address in memory of the growheap's block. This */ + /* can change between two object adds, due to */ + /* reallocation. */ + /* */ + /* cursor :: The current top of the grow heap within its block. */ + /* */ + /* capacity :: The current size of the heap block. Increments by */ + /* 1kByte chunks. */ + /* */ + /* max_elems :: The maximum number of elements in table. */ + /* */ + /* num_elems :: The current number of elements in table. */ + /* */ + /* elements :: A table of element addresses within the block. */ + /* */ + /* lengths :: A table of element sizes within the block. */ + /* */ + /* memory :: The object used for memory operations */ + /* (alloc/realloc). */ + /* */ + /* funcs :: A table of method pointers for this object. */ + /* */ + typedef struct PS_TableRec_ + { + FT_Byte* block; /* current memory block */ + FT_Offset cursor; /* current cursor in memory block */ + FT_Offset capacity; /* current size of memory block */ + FT_Long init; + + FT_Int max_elems; + FT_Int num_elems; + FT_Byte** elements; /* addresses of table elements */ + FT_PtrDist* lengths; /* lengths of table elements */ + + FT_Memory memory; + PS_Table_FuncsRec funcs; + + } PS_TableRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 FIELDS & TOKENS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PS_ParserRec_* PS_Parser; + + typedef struct T1_TokenRec_* T1_Token; + + typedef struct T1_FieldRec_* T1_Field; + + + /* simple enumeration type used to identify token types */ + typedef enum T1_TokenType_ + { + T1_TOKEN_TYPE_NONE = 0, + T1_TOKEN_TYPE_ANY, + T1_TOKEN_TYPE_STRING, + T1_TOKEN_TYPE_ARRAY, + T1_TOKEN_TYPE_KEY, /* aka `name' */ + + /* do not remove */ + T1_TOKEN_TYPE_MAX + + } T1_TokenType; + + + /* a simple structure used to identify tokens */ + typedef struct T1_TokenRec_ + { + FT_Byte* start; /* first character of token in input stream */ + FT_Byte* limit; /* first character after the token */ + T1_TokenType type; /* type of token */ + + } T1_TokenRec; + + + /* enumeration type used to identify object fields */ + typedef enum T1_FieldType_ + { + T1_FIELD_TYPE_NONE = 0, + T1_FIELD_TYPE_BOOL, + T1_FIELD_TYPE_INTEGER, + T1_FIELD_TYPE_FIXED, + T1_FIELD_TYPE_FIXED_1000, + T1_FIELD_TYPE_STRING, + T1_FIELD_TYPE_KEY, + T1_FIELD_TYPE_BBOX, + T1_FIELD_TYPE_INTEGER_ARRAY, + T1_FIELD_TYPE_FIXED_ARRAY, + T1_FIELD_TYPE_CALLBACK, + + /* do not remove */ + T1_FIELD_TYPE_MAX + + } T1_FieldType; + + + typedef enum T1_FieldLocation_ + { + T1_FIELD_LOCATION_CID_INFO, + T1_FIELD_LOCATION_FONT_DICT, + T1_FIELD_LOCATION_FONT_INFO, + T1_FIELD_LOCATION_PRIVATE, + T1_FIELD_LOCATION_BBOX, + T1_FIELD_LOCATION_LOADER, + T1_FIELD_LOCATION_FACE, + T1_FIELD_LOCATION_BLEND, + + /* do not remove */ + T1_FIELD_LOCATION_MAX + + } T1_FieldLocation; + + + typedef void + (*T1_Field_ParseFunc)( FT_Face face, + FT_Pointer parser ); + + + /* structure type used to model object fields */ + typedef struct T1_FieldRec_ + { + const char* ident; /* field identifier */ + T1_FieldLocation location; + T1_FieldType type; /* type of field */ + T1_Field_ParseFunc reader; + FT_UInt offset; /* offset of field in object */ + FT_Byte size; /* size of field in bytes */ + FT_UInt array_max; /* maximal number of elements for */ + /* array */ + FT_UInt count_offset; /* offset of element count for */ + /* arrays */ + FT_UInt dict; /* where we expect it */ + } T1_FieldRec; + +#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */ +#define T1_FIELD_DICT_PRIVATE ( 1 << 1 ) + + + +#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE( _fname ), \ + 0, 0, \ + _dict \ + }, + +#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \ + { \ + _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \ + (T1_Field_ParseFunc)_reader, \ + 0, 0, \ + 0, 0, \ + _dict \ + }, + +#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE_DELTA( _fname ), \ + _max, \ + FT_FIELD_OFFSET( num_ ## _fname ), \ + _dict \ + }, + +#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \ + { \ + _ident, T1CODE, _type, \ + 0, \ + FT_FIELD_OFFSET( _fname ), \ + FT_FIELD_SIZE_DELTA( _fname ), \ + _max, 0, \ + _dict \ + }, + + +#define T1_FIELD_BOOL( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict ) + +#define T1_FIELD_NUM( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict ) + +#define T1_FIELD_FIXED( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict ) + +#define T1_FIELD_FIXED_1000( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \ + _dict ) + +#define T1_FIELD_STRING( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict ) + +#define T1_FIELD_KEY( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict ) + +#define T1_FIELD_BBOX( _ident, _fname, _dict ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict ) + + +#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict ) \ + T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ + _fname, _fmax, _dict ) + +#define T1_FIELD_CALLBACK( _ident, _name, _dict ) \ + T1_NEW_CALLBACK_FIELD( _ident, _name, _dict ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef const struct PS_Parser_FuncsRec_* PS_Parser_Funcs; + + typedef struct PS_Parser_FuncsRec_ + { + void + (*init)( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ); + + void + (*done)( PS_Parser parser ); + + void + (*skip_spaces)( PS_Parser parser ); + void + (*skip_PS_token)( PS_Parser parser ); + + FT_Long + (*to_int)( PS_Parser parser ); + FT_Fixed + (*to_fixed)( PS_Parser parser, + FT_Int power_ten ); + + FT_Error + (*to_bytes)( PS_Parser parser, + FT_Byte* bytes, + FT_Long max_bytes, + FT_Long* pnum_bytes, + FT_Bool delimiters ); + + FT_Int + (*to_coord_array)( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ); + FT_Int + (*to_fixed_array)( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ); + + void + (*to_token)( PS_Parser parser, + T1_Token token ); + void + (*to_token_array)( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ); + + FT_Error + (*load_field)( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_Error + (*load_field_table)( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + } PS_Parser_FuncsRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_ParserRec */ + /* */ + /* <Description> */ + /* A PS_Parser is an object used to parse a Type 1 font very quickly. */ + /* */ + /* <Fields> */ + /* cursor :: The current position in the text. */ + /* */ + /* base :: Start of the processed text. */ + /* */ + /* limit :: End of the processed text. */ + /* */ + /* error :: The last error returned. */ + /* */ + /* memory :: The object used for memory operations (alloc/realloc). */ + /* */ + /* funcs :: A table of functions for the parser. */ + /* */ + typedef struct PS_ParserRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + FT_Error error; + FT_Memory memory; + + PS_Parser_FuncsRec funcs; + + } PS_ParserRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct T1_BuilderRec_* T1_Builder; + + + typedef FT_Error + (*T1_Builder_Check_Points_Func)( T1_Builder builder, + FT_Int count ); + + typedef void + (*T1_Builder_Add_Point_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + + typedef FT_Error + (*T1_Builder_Add_Point1_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + typedef FT_Error + (*T1_Builder_Add_Contour_Func)( T1_Builder builder ); + + typedef FT_Error + (*T1_Builder_Start_Point_Func)( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + typedef void + (*T1_Builder_Close_Contour_Func)( T1_Builder builder ); + + + typedef const struct T1_Builder_FuncsRec_* T1_Builder_Funcs; + + typedef struct T1_Builder_FuncsRec_ + { + void + (*init)( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Bool hinting ); + + void + (*done)( T1_Builder builder ); + + T1_Builder_Check_Points_Func check_points; + T1_Builder_Add_Point_Func add_point; + T1_Builder_Add_Point1_Func add_point1; + T1_Builder_Add_Contour_Func add_contour; + T1_Builder_Start_Point_Func start_point; + T1_Builder_Close_Contour_Func close_contour; + + } T1_Builder_FuncsRec; + + + /* an enumeration type to handle charstring parsing states */ + typedef enum T1_ParseState_ + { + T1_Parse_Start, + T1_Parse_Have_Width, + T1_Parse_Have_Moveto, + T1_Parse_Have_Path + + } T1_ParseState; + + + /*************************************************************************/ + /* */ + /* <Structure> */ + /* T1_BuilderRec */ + /* */ + /* <Description> */ + /* A structure used during glyph loading to store its outline. */ + /* */ + /* <Fields> */ + /* memory :: The current memory object. */ + /* */ + /* face :: The current face object. */ + /* */ + /* glyph :: The current glyph slot. */ + /* */ + /* loader :: XXX */ + /* */ + /* base :: The base glyph outline. */ + /* */ + /* current :: The current glyph outline. */ + /* */ + /* max_points :: maximum points in builder outline */ + /* */ + /* max_contours :: Maximal number of contours in builder outline. */ + /* */ + /* last :: The last point position. */ + /* */ + /* scale_x :: The horizontal scaling value (FUnits to */ + /* sub-pixels). */ + /* */ + /* scale_y :: The vertical scaling value (FUnits to sub-pixels). */ + /* */ + /* pos_x :: The horizontal translation (if composite glyph). */ + /* */ + /* pos_y :: The vertical translation (if composite glyph). */ + /* */ + /* left_bearing :: The left side bearing point. */ + /* */ + /* advance :: The horizontal advance vector. */ + /* */ + /* bbox :: Unused. */ + /* */ + /* parse_state :: An enumeration which controls the charstring */ + /* parsing state. */ + /* */ + /* load_points :: If this flag is not set, no points are loaded. */ + /* */ + /* no_recurse :: Set but not used. */ + /* */ + /* metrics_only :: A boolean indicating that we only want to compute */ + /* the metrics of a given glyph, not load all of its */ + /* points. */ + /* */ + /* funcs :: An array of function pointers for the builder. */ + /* */ + typedef struct T1_BuilderRec_ + { + FT_Memory memory; + FT_Face face; + FT_GlyphSlot glyph; + FT_GlyphLoader loader; + FT_Outline* base; + FT_Outline* current; + + FT_Vector last; + + FT_Fixed scale_x; + FT_Fixed scale_y; + + FT_Pos pos_x; + FT_Pos pos_y; + + FT_Vector left_bearing; + FT_Vector advance; + + FT_BBox bbox; /* bounding box */ + T1_ParseState parse_state; + FT_Bool load_points; + FT_Bool no_recurse; + FT_Bool shift; + + FT_Bool metrics_only; + + void* hints_funcs; /* hinter-specific */ + void* hints_globals; /* hinter-specific */ + + T1_Builder_FuncsRec funcs; + + } T1_BuilderRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 DECODER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#if 0 + + /*************************************************************************/ + /* */ + /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ + /* calls during glyph loading. */ + /* */ +#define T1_MAX_SUBRS_CALLS 8 + + + /*************************************************************************/ + /* */ + /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ + /* minimum of 16 is required. */ + /* */ +#define T1_MAX_CHARSTRINGS_OPERANDS 32 + +#endif /* 0 */ + + + typedef struct T1_Decoder_ZoneRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + + } T1_Decoder_ZoneRec, *T1_Decoder_Zone; + + + typedef struct T1_DecoderRec_* T1_Decoder; + typedef const struct T1_Decoder_FuncsRec_* T1_Decoder_Funcs; + + + typedef FT_Error + (*T1_Decoder_Callback)( T1_Decoder decoder, + FT_UInt glyph_index ); + + + typedef struct T1_Decoder_FuncsRec_ + { + FT_Error + (*init)( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback callback ); + + void + (*done)( T1_Decoder decoder ); + + FT_Error + (*parse_charstrings)( T1_Decoder decoder, + FT_Byte* base, + FT_UInt len ); + + } T1_Decoder_FuncsRec; + + + typedef struct T1_DecoderRec_ + { + T1_BuilderRec builder; + + FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS]; + FT_Long* top; + + T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1]; + T1_Decoder_Zone zone; + + FT_Service_PsCMaps psnames; /* for seac */ + FT_UInt num_glyphs; + FT_Byte** glyph_names; + + FT_Int lenIV; /* internal for sub routine calls */ + FT_UInt num_subrs; + FT_Byte** subrs; + FT_PtrDist* subrs_len; /* array of subrs length (optional) */ + + FT_Matrix font_matrix; + FT_Vector font_offset; + + FT_Int flex_state; + FT_Int num_flex_vectors; + FT_Vector flex_vectors[7]; + + PS_Blend blend; /* for multiple master support */ + + FT_Render_Mode hint_mode; + + T1_Decoder_Callback parse_callback; + T1_Decoder_FuncsRec funcs; + + FT_Int* buildchar; + FT_UInt len_buildchar; + + } T1_DecoderRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** AFM PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AFM_ParserRec_* AFM_Parser; + + typedef struct AFM_Parser_FuncsRec_ + { + FT_Error + (*init)( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ); + + void + (*done)( AFM_Parser parser ); + + FT_Error + (*parse)( AFM_Parser parser ); + + } AFM_Parser_FuncsRec; + + + typedef struct AFM_StreamRec_* AFM_Stream; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* AFM_ParserRec */ + /* */ + /* <Description> */ + /* An AFM_Parser is a parser for the AFM files. */ + /* */ + /* <Fields> */ + /* memory :: The object used for memory operations (alloc and */ + /* realloc). */ + /* */ + /* stream :: This is an opaque object. */ + /* */ + /* FontInfo :: The result will be stored here. */ + /* */ + /* get_index :: A user provided function to get a glyph index by its */ + /* name. */ + /* */ + typedef struct AFM_ParserRec_ + { + FT_Memory memory; + AFM_Stream stream; + + AFM_FontInfo FontInfo; + + FT_Int + (*get_index)( const char* name, + FT_UInt len, + void* user_data ); + + void* user_data; + + } AFM_ParserRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CHARMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes; + + typedef struct T1_CMap_ClassesRec_ + { + FT_CMap_Class standard; + FT_CMap_Class expert; + FT_CMap_Class custom; + FT_CMap_Class unicode; + + } T1_CMap_ClassesRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PSAux Module Interface *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PSAux_ServiceRec_ + { + /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */ + const PS_Table_FuncsRec* ps_table_funcs; + const PS_Parser_FuncsRec* ps_parser_funcs; + const T1_Builder_FuncsRec* t1_builder_funcs; + const T1_Decoder_FuncsRec* t1_decoder_funcs; + + void + (*t1_decrypt)( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ); + + T1_CMap_Classes t1_cmap_classes; + + /* fields after this comment line were added after version 2.1.10 */ + const AFM_Parser_FuncsRec* afm_parser_funcs; + + } PSAux_ServiceRec, *PSAux_Service; + + /* backwards-compatible type definition */ + typedef PSAux_ServiceRec PSAux_Interface; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Some convenience functions *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define IS_PS_NEWLINE( ch ) \ + ( (ch) == '\r' || \ + (ch) == '\n' ) + +#define IS_PS_SPACE( ch ) \ + ( (ch) == ' ' || \ + IS_PS_NEWLINE( ch ) || \ + (ch) == '\t' || \ + (ch) == '\f' || \ + (ch) == '\0' ) + +#define IS_PS_SPECIAL( ch ) \ + ( (ch) == '/' || \ + (ch) == '(' || (ch) == ')' || \ + (ch) == '<' || (ch) == '>' || \ + (ch) == '[' || (ch) == ']' || \ + (ch) == '{' || (ch) == '}' || \ + (ch) == '%' ) + +#define IS_PS_DELIM( ch ) \ + ( IS_PS_SPACE( ch ) || \ + IS_PS_SPECIAL( ch ) ) + +#define IS_PS_DIGIT( ch ) \ + ( (ch) >= '0' && (ch) <= '9' ) + +#define IS_PS_XDIGIT( ch ) \ + ( IS_PS_DIGIT( ch ) || \ + ( (ch) >= 'A' && (ch) <= 'F' ) || \ + ( (ch) >= 'a' && (ch) <= 'f' ) ) + +#define IS_PS_BASE85( ch ) \ + ( (ch) >= '!' && (ch) <= 'u' ) + +#define IS_PS_TOKEN( cur, limit, token ) \ + ( (char)(cur)[0] == (token)[0] && \ + ( (cur) + sizeof ( (token) ) == (limit) || \ + ( (cur) + sizeof( (token) ) < (limit) && \ + IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) ) && \ + ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 ) + + +FT_END_HEADER + +#endif /* __PSAUX_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/pshints.h b/libIGraph/include/freetype/internal/pshints.h new file mode 100644 index 0000000..161eaff --- /dev/null +++ b/libIGraph/include/freetype/internal/pshints.h @@ -0,0 +1,687 @@ +/***************************************************************************/ +/* */ +/* pshints.h */ +/* */ +/* Interface to Postscript-specific (Type 1 and Type 2) hints */ +/* recorders (specification only). These are used to support native */ +/* T1/T2 hints in the `type1', `cid', and `cff' font drivers. */ +/* */ +/* Copyright 2001, 2002, 2003, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __PSHINTS_H__ +#define __PSHINTS_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_TYPE1_TABLES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** INTERNAL REPRESENTATION OF GLOBALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct PSH_GlobalsRec_* PSH_Globals; + + typedef FT_Error + (*PSH_Globals_NewFunc)( FT_Memory memory, + T1_Private* private_dict, + PSH_Globals* aglobals ); + + typedef FT_Error + (*PSH_Globals_SetScaleFunc)( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ); + + typedef void + (*PSH_Globals_DestroyFunc)( PSH_Globals globals ); + + + typedef struct PSH_Globals_FuncsRec_ + { + PSH_Globals_NewFunc create; + PSH_Globals_SetScaleFunc set_scale; + PSH_Globals_DestroyFunc destroy; + + } PSH_Globals_FuncsRec, *PSH_Globals_Funcs; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PUBLIC TYPE 1 HINTS RECORDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************* + * + * @type: + * T1_Hints + * + * @description: + * This is a handle to an opaque structure used to record glyph hints + * from a Type 1 character glyph character string. + * + * The methods used to operate on this object are defined by the + * @T1_Hints_FuncsRec structure. Recording glyph hints is normally + * achieved through the following scheme: + * + * - Open a new hint recording session by calling the `open' method. + * This rewinds the recorder and prepare it for new input. + * + * - For each hint found in the glyph charstring, call the corresponding + * method (`stem', `stem3', or `reset'). Note that these functions do + * not return an error code. + * + * - Close the recording session by calling the `close' method. It + * returns an error code if the hints were invalid or something + * strange happened (e.g., memory shortage). + * + * The hints accumulated in the object can later be used by the + * PostScript hinter. + * + */ + typedef struct T1_HintsRec_* T1_Hints; + + + /************************************************************************* + * + * @type: + * T1_Hints_Funcs + * + * @description: + * A pointer to the @T1_Hints_FuncsRec structure that defines the API of + * a given @T1_Hints object. + * + */ + typedef const struct T1_Hints_FuncsRec_* T1_Hints_Funcs; + + + /************************************************************************* + * + * @functype: + * T1_Hints_OpenFunc + * + * @description: + * A method of the @T1_Hints class used to prepare it for a new Type 1 + * hints recording session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * @note: + * You should always call the @T1_Hints_CloseFunc method in order to + * close an opened recording session. + * + */ + typedef void + (*T1_Hints_OpenFunc)( T1_Hints hints ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_SetStemFunc + * + * @description: + * A method of the @T1_Hints class used to record a new horizontal or + * vertical stem. This corresponds to the Type 1 `hstem' and `vstem' + * operators. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * dimension :: + * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). + * + * coords :: + * Array of 2 integers, used as (position,length) stem descriptor. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * `coords[0]' is the absolute stem position (lowest coordinate); + * `coords[1]' is the length. + * + * The length can be negative, in which case it must be either -20 or + * -21. It is interpreted as a `ghost' stem, according to the Type 1 + * specification. + * + * If the length is -21 (corresponding to a bottom ghost stem), then + * the real stem position is `coords[0]+coords[1]'. + * + */ + typedef void + (*T1_Hints_SetStemFunc)( T1_Hints hints, + FT_UInt dimension, + FT_Long* coords ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_SetStem3Func + * + * @description: + * A method of the @T1_Hints class used to record three + * counter-controlled horizontal or vertical stems at once. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * dimension :: + * 0 for horizontal stems, 1 for vertical ones. + * + * coords :: + * An array of 6 integers, holding 3 (position,length) pairs for the + * counter-controlled stems. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * The lengths cannot be negative (ghost stems are never + * counter-controlled). + * + */ + typedef void + (*T1_Hints_SetStem3Func)( T1_Hints hints, + FT_UInt dimension, + FT_Long* coords ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_ResetFunc + * + * @description: + * A method of the @T1_Hints class used to reset the stems hints in a + * recording session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph in which the + * previously defined hints apply. + * + */ + typedef void + (*T1_Hints_ResetFunc)( T1_Hints hints, + FT_UInt end_point ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_CloseFunc + * + * @description: + * A method of the @T1_Hints class used to close a hint recording + * session. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The error code is set to indicate that an error occurred during the + * recording session. + * + */ + typedef FT_Error + (*T1_Hints_CloseFunc)( T1_Hints hints, + FT_UInt end_point ); + + + /************************************************************************* + * + * @functype: + * T1_Hints_ApplyFunc + * + * @description: + * A method of the @T1_Hints class used to apply hints to the + * corresponding glyph outline. Must be called once all hints have been + * recorded. + * + * @input: + * hints :: + * A handle to the Type 1 hints recorder. + * + * outline :: + * A pointer to the target outline descriptor. + * + * globals :: + * The hinter globals for this font. + * + * hint_mode :: + * Hinting information. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * On input, all points within the outline are in font coordinates. On + * output, they are in 1/64th of pixels. + * + * The scaling transformation is taken from the `globals' object which + * must correspond to the same font as the glyph. + * + */ + typedef FT_Error + (*T1_Hints_ApplyFunc)( T1_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + + /************************************************************************* + * + * @struct: + * T1_Hints_FuncsRec + * + * @description: + * The structure used to provide the API to @T1_Hints objects. + * + * @fields: + * hints :: + * A handle to the T1 Hints recorder. + * + * open :: + * The function to open a recording session. + * + * close :: + * The function to close a recording session. + * + * stem :: + * The function to set a simple stem. + * + * stem3 :: + * The function to set counter-controlled stems. + * + * reset :: + * The function to reset stem hints. + * + * apply :: + * The function to apply the hints to the corresponding glyph outline. + * + */ + typedef struct T1_Hints_FuncsRec_ + { + T1_Hints hints; + T1_Hints_OpenFunc open; + T1_Hints_CloseFunc close; + T1_Hints_SetStemFunc stem; + T1_Hints_SetStem3Func stem3; + T1_Hints_ResetFunc reset; + T1_Hints_ApplyFunc apply; + + } T1_Hints_FuncsRec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PUBLIC TYPE 2 HINTS RECORDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /************************************************************************* + * + * @type: + * T2_Hints + * + * @description: + * This is a handle to an opaque structure used to record glyph hints + * from a Type 2 character glyph character string. + * + * The methods used to operate on this object are defined by the + * @T2_Hints_FuncsRec structure. Recording glyph hints is normally + * achieved through the following scheme: + * + * - Open a new hint recording session by calling the `open' method. + * This rewinds the recorder and prepare it for new input. + * + * - For each hint found in the glyph charstring, call the corresponding + * method (`stems', `hintmask', `counters'). Note that these + * functions do not return an error code. + * + * - Close the recording session by calling the `close' method. It + * returns an error code if the hints were invalid or something + * strange happened (e.g., memory shortage). + * + * The hints accumulated in the object can later be used by the + * Postscript hinter. + * + */ + typedef struct T2_HintsRec_* T2_Hints; + + + /************************************************************************* + * + * @type: + * T2_Hints_Funcs + * + * @description: + * A pointer to the @T2_Hints_FuncsRec structure that defines the API of + * a given @T2_Hints object. + * + */ + typedef const struct T2_Hints_FuncsRec_* T2_Hints_Funcs; + + + /************************************************************************* + * + * @functype: + * T2_Hints_OpenFunc + * + * @description: + * A method of the @T2_Hints class used to prepare it for a new Type 2 + * hints recording session. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * @note: + * You should always call the @T2_Hints_CloseFunc method in order to + * close an opened recording session. + * + */ + typedef void + (*T2_Hints_OpenFunc)( T2_Hints hints ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_StemsFunc + * + * @description: + * A method of the @T2_Hints class used to set the table of stems in + * either the vertical or horizontal dimension. Equivalent to the + * `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * dimension :: + * 0 for horizontal stems (hstem), 1 for vertical ones (vstem). + * + * count :: + * The number of stems. + * + * coords :: + * An array of `count' (position,length) pairs. + * + * @note: + * Use vertical coordinates (y) for horizontal stems (dim=0). Use + * horizontal coordinates (x) for vertical stems (dim=1). + * + * There are `2*count' elements in the `coords' array. Each even + * element is an absolute position in font units, each odd element is a + * length in font units. + * + * A length can be negative, in which case it must be either -20 or + * -21. It is interpreted as a `ghost' stem, according to the Type 1 + * specification. + * + */ + typedef void + (*T2_Hints_StemsFunc)( T2_Hints hints, + FT_UInt dimension, + FT_UInt count, + FT_Fixed* coordinates ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_MaskFunc + * + * @description: + * A method of the @T2_Hints class used to set a given hintmask (this + * corresponds to the `hintmask' Type 2 operator). + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * The glyph index of the last point to which the previously defined + * or activated hints apply. + * + * bit_count :: + * The number of bits in the hint mask. + * + * bytes :: + * An array of bytes modelling the hint mask. + * + * @note: + * If the hintmask starts the charstring (before any glyph point + * definition), the value of `end_point' should be 0. + * + * `bit_count' is the number of meaningful bits in the `bytes' array; it + * must be equal to the total number of hints defined so far (i.e., + * horizontal+verticals). + * + * The `bytes' array can come directly from the Type 2 charstring and + * respects the same format. + * + */ + typedef void + (*T2_Hints_MaskFunc)( T2_Hints hints, + FT_UInt end_point, + FT_UInt bit_count, + const FT_Byte* bytes ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_CounterFunc + * + * @description: + * A method of the @T2_Hints class used to set a given counter mask + * (this corresponds to the `hintmask' Type 2 operator). + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * A glyph index of the last point to which the previously defined or + * active hints apply. + * + * bit_count :: + * The number of bits in the hint mask. + * + * bytes :: + * An array of bytes modelling the hint mask. + * + * @note: + * If the hintmask starts the charstring (before any glyph point + * definition), the value of `end_point' should be 0. + * + * `bit_count' is the number of meaningful bits in the `bytes' array; it + * must be equal to the total number of hints defined so far (i.e., + * horizontal+verticals). + * + * The `bytes' array can come directly from the Type 2 charstring and + * respects the same format. + * + */ + typedef void + (*T2_Hints_CounterFunc)( T2_Hints hints, + FT_UInt bit_count, + const FT_Byte* bytes ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_CloseFunc + * + * @description: + * A method of the @T2_Hints class used to close a hint recording + * session. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * end_point :: + * The index of the last point in the input glyph. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The error code is set to indicate that an error occurred during the + * recording session. + * + */ + typedef FT_Error + (*T2_Hints_CloseFunc)( T2_Hints hints, + FT_UInt end_point ); + + + /************************************************************************* + * + * @functype: + * T2_Hints_ApplyFunc + * + * @description: + * A method of the @T2_Hints class used to apply hints to the + * corresponding glyph outline. Must be called after the `close' + * method. + * + * @input: + * hints :: + * A handle to the Type 2 hints recorder. + * + * outline :: + * A pointer to the target outline descriptor. + * + * globals :: + * The hinter globals for this font. + * + * hint_mode :: + * Hinting information. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * On input, all points within the outline are in font coordinates. On + * output, they are in 1/64th of pixels. + * + * The scaling transformation is taken from the `globals' object which + * must correspond to the same font than the glyph. + * + */ + typedef FT_Error + (*T2_Hints_ApplyFunc)( T2_Hints hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + + /************************************************************************* + * + * @struct: + * T2_Hints_FuncsRec + * + * @description: + * The structure used to provide the API to @T2_Hints objects. + * + * @fields: + * hints :: + * A handle to the T2 hints recorder object. + * + * open :: + * The function to open a recording session. + * + * close :: + * The function to close a recording session. + * + * stems :: + * The function to set the dimension's stems table. + * + * hintmask :: + * The function to set hint masks. + * + * counter :: + * The function to set counter masks. + * + * apply :: + * The function to apply the hints on the corresponding glyph outline. + * + */ + typedef struct T2_Hints_FuncsRec_ + { + T2_Hints hints; + T2_Hints_OpenFunc open; + T2_Hints_CloseFunc close; + T2_Hints_StemsFunc stems; + T2_Hints_MaskFunc hintmask; + T2_Hints_CounterFunc counter; + T2_Hints_ApplyFunc apply; + + } T2_Hints_FuncsRec; + + + /* */ + + + typedef struct PSHinter_Interface_ + { + PSH_Globals_Funcs (*get_globals_funcs)( FT_Module module ); + T1_Hints_Funcs (*get_t1_funcs) ( FT_Module module ); + T2_Hints_Funcs (*get_t2_funcs) ( FT_Module module ); + + } PSHinter_Interface; + + typedef PSHinter_Interface* PSHinter_Service; + + +FT_END_HEADER + +#endif /* __PSHINTS_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/services/svbdf.h b/libIGraph/include/freetype/internal/services/svbdf.h new file mode 100644 index 0000000..a170037 --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svbdf.h @@ -0,0 +1,57 @@ +/***************************************************************************/ +/* */ +/* svbdf.h */ +/* */ +/* The FreeType BDF services (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVBDF_H__ +#define __SVBDF_H__ + +#include FT_BDF_H +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_BDF "bdf" + + typedef FT_Error + (*FT_BDF_GetCharsetIdFunc)( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ); + + typedef FT_Error + (*FT_BDF_GetPropertyFunc)( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ); + + + FT_DEFINE_SERVICE( BDF ) + { + FT_BDF_GetCharsetIdFunc get_charset_id; + FT_BDF_GetPropertyFunc get_property; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVBDF_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/services/svgldict.h b/libIGraph/include/freetype/internal/services/svgldict.h new file mode 100644 index 0000000..339f6c0 --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svgldict.h @@ -0,0 +1,60 @@ +/***************************************************************************/ +/* */ +/* svgldict.h */ +/* */ +/* The FreeType glyph dictionary services (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVGLDICT_H__ +#define __SVGLDICT_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A service used to retrieve glyph names, as well as to find the + * index of a given glyph name in a font. + * + */ + +#define FT_SERVICE_ID_GLYPH_DICT "glyph-dict" + + + typedef FT_Error + (*FT_GlyphDict_GetNameFunc)( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ); + + typedef FT_UInt + (*FT_GlyphDict_NameIndexFunc)( FT_Face face, + FT_String* glyph_name ); + + + FT_DEFINE_SERVICE( GlyphDict ) + { + FT_GlyphDict_GetNameFunc get_name; + FT_GlyphDict_NameIndexFunc name_index; /* optional */ + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVGLDICT_H__ */ diff --git a/libIGraph/include/freetype/internal/services/svgxval.h b/libIGraph/include/freetype/internal/services/svgxval.h new file mode 100644 index 0000000..bfcd860 --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svgxval.h @@ -0,0 +1,72 @@ +/***************************************************************************/ +/* */ +/* svgxval.h */ +/* */ +/* FreeType API for validating TrueTypeGX/AAT tables (specification). */ +/* */ +/* Copyright 2004, 2005 by */ +/* Masatake YAMATO, Red Hat K.K., */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVGXVAL_H__ +#define __SVGXVAL_H__ + +#include FT_GX_VALIDATE_H +#include FT_INTERNAL_VALIDATE_H + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_GX_VALIDATE "truetypegx-validate" +#define FT_SERVICE_ID_CLASSICKERN_VALIDATE "classickern-validate" + + typedef FT_Error + (*gxv_validate_func)( FT_Face face, + FT_UInt gx_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ); + + + typedef FT_Error + (*ckern_validate_func)( FT_Face face, + FT_UInt ckern_flags, + FT_Bytes *ckern_table ); + + + FT_DEFINE_SERVICE( GXvalidate ) + { + gxv_validate_func validate; + }; + + FT_DEFINE_SERVICE( CKERNvalidate ) + { + ckern_validate_func validate; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVGXVAL_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/services/svkern.h b/libIGraph/include/freetype/internal/services/svkern.h new file mode 100644 index 0000000..af77a43 --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svkern.h @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* svkern.h */ +/* */ +/* The FreeType Kerning service (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVKERN_H__ +#define __SVKERN_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + +#define FT_SERVICE_ID_KERNING "kerning" + + + typedef FT_Error + (*FT_Kerning_TrackGetFunc)( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ); + + FT_DEFINE_SERVICE( Kerning ) + { + FT_Kerning_TrackGetFunc get_track; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVKERN_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/services/svmm.h b/libIGraph/include/freetype/internal/services/svmm.h new file mode 100644 index 0000000..6769b55 --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svmm.h @@ -0,0 +1,79 @@ +/***************************************************************************/ +/* */ +/* svmm.h */ +/* */ +/* The FreeType Multiple Masters and GX var services (specification). */ +/* */ +/* Copyright 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVMM_H__ +#define __SVMM_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A service used to manage multiple-masters data in a given face. + * + * See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H). + * + */ + +#define FT_SERVICE_ID_MULTI_MASTERS "multi-masters" + + + typedef FT_Error + (*FT_Get_MM_Func)( FT_Face face, + FT_Multi_Master* master ); + + typedef FT_Error + (*FT_Get_MM_Var_Func)( FT_Face face, + FT_MM_Var* *master ); + + typedef FT_Error + (*FT_Set_MM_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + typedef FT_Error + (*FT_Set_Var_Design_Func)( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + typedef FT_Error + (*FT_Set_MM_Blend_Func)( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ); + + + FT_DEFINE_SERVICE( MultiMasters ) + { + FT_Get_MM_Func get_mm; + FT_Set_MM_Design_Func set_mm_design; + FT_Set_MM_Blend_Func set_mm_blend; + FT_Get_MM_Var_Func get_mm_var; + FT_Set_Var_Design_Func set_var_design; + }; + + /* */ + + +FT_END_HEADER + +#endif /* __SVMM_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/services/svotval.h b/libIGraph/include/freetype/internal/services/svotval.h new file mode 100644 index 0000000..d7f2155 --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svotval.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* svotval.h */ +/* */ +/* The FreeType OpenType validation service (specification). */ +/* */ +/* Copyright 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVOTVAL_H__ +#define __SVOTVAL_H__ + +#include FT_OPENTYPE_VALIDATE_H +#include FT_INTERNAL_VALIDATE_H + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_OPENTYPE_VALIDATE "opentype-validate" + + + typedef FT_Error + (*otv_validate_func)( FT_Face volatile face, + FT_UInt ot_flags, + FT_Bytes *base, + FT_Bytes *gdef, + FT_Bytes *gpos, + FT_Bytes *gsub, + FT_Bytes *jstf ); + + + FT_DEFINE_SERVICE( OTvalidate ) + { + otv_validate_func validate; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVOTVAL_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/services/svpfr.h b/libIGraph/include/freetype/internal/services/svpfr.h new file mode 100644 index 0000000..1cc131e --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svpfr.h @@ -0,0 +1,66 @@ +/***************************************************************************/ +/* */ +/* svpfr.h */ +/* */ +/* Internal PFR service functions (specification). */ +/* */ +/* Copyright 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPFR_H__ +#define __SVPFR_H__ + +#include FT_PFR_H +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_PFR_METRICS "pfr-metrics" + + + typedef FT_Error + (*FT_PFR_GetMetricsFunc)( FT_Face face, + FT_UInt *aoutline, + FT_UInt *ametrics, + FT_Fixed *ax_scale, + FT_Fixed *ay_scale ); + + typedef FT_Error + (*FT_PFR_GetKerningFunc)( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ); + + typedef FT_Error + (*FT_PFR_GetAdvanceFunc)( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ); + + + FT_DEFINE_SERVICE( PfrMetrics ) + { + FT_PFR_GetMetricsFunc get_metrics; + FT_PFR_GetKerningFunc get_kerning; + FT_PFR_GetAdvanceFunc get_advance; + + }; + + /* */ + +FT_END_HEADER + +#endif /* __SVPFR_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/services/svpostnm.h b/libIGraph/include/freetype/internal/services/svpostnm.h new file mode 100644 index 0000000..019a633 --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svpostnm.h @@ -0,0 +1,58 @@ +/***************************************************************************/ +/* */ +/* svpostnm.h */ +/* */ +/* The FreeType PostScript name services (specification). */ +/* */ +/* Copyright 2003, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPOSTNM_H__ +#define __SVPOSTNM_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + /* + * A trivial service used to retrieve the PostScript name of a given + * font when available. The `get_name' field should never be NULL. + * + * The corresponding function can return NULL to indicate that the + * PostScript name is not available. + * + * The name is owned by the face and will be destroyed with it. + */ + +#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME "postscript-font-name" + + + typedef const char* + (*FT_PsName_GetFunc)( FT_Face face ); + + + FT_DEFINE_SERVICE( PsFontName ) + { + FT_PsName_GetFunc get_ps_font_name; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPOSTNM_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/services/svpscmap.h b/libIGraph/include/freetype/internal/services/svpscmap.h new file mode 100644 index 0000000..24ecf83 --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svpscmap.h @@ -0,0 +1,129 @@ +/***************************************************************************/ +/* */ +/* svpscmap.h */ +/* */ +/* The FreeType PostScript charmap service (specification). */ +/* */ +/* Copyright 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPSCMAP_H__ +#define __SVPSCMAP_H__ + +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_POSTSCRIPT_CMAPS "postscript-cmaps" + + + /* + * Adobe glyph name to unicode value. + */ + typedef FT_UInt32 + (*PS_Unicode_ValueFunc)( const char* glyph_name ); + + /* + * Macintosh name id to glyph name. NULL if invalid index. + */ + typedef const char* + (*PS_Macintosh_NameFunc)( FT_UInt name_index ); + + /* + * Adobe standard string ID to glyph name. NULL if invalid index. + */ + typedef const char* + (*PS_Adobe_Std_StringsFunc)( FT_UInt string_index ); + + + /* + * Simple unicode -> glyph index charmap built from font glyph names + * table. + */ + typedef struct PS_UniMap_ + { + FT_UInt32 unicode; /* bit 31 set: is glyph variant */ + FT_UInt glyph_index; + + } PS_UniMap; + + + typedef struct PS_UnicodesRec_* PS_Unicodes; + + typedef struct PS_UnicodesRec_ + { + FT_CMapRec cmap; + FT_UInt num_maps; + PS_UniMap* maps; + + } PS_UnicodesRec; + + + /* + * A function which returns a glyph name for a given index. Returns + * NULL if invalid index. + */ + typedef const char* + (*PS_GetGlyphNameFunc)( FT_Pointer data, + FT_UInt string_index ); + + /* + * A function used to release the glyph name returned by + * PS_GetGlyphNameFunc, when needed + */ + typedef void + (*PS_FreeGlyphNameFunc)( FT_Pointer data, + const char* name ); + + typedef FT_Error + (*PS_Unicodes_InitFunc)( FT_Memory memory, + PS_Unicodes unicodes, + FT_UInt num_glyphs, + PS_GetGlyphNameFunc get_glyph_name, + PS_FreeGlyphNameFunc free_glyph_name, + FT_Pointer glyph_data ); + + typedef FT_UInt + (*PS_Unicodes_CharIndexFunc)( PS_Unicodes unicodes, + FT_UInt32 unicode ); + + typedef FT_ULong + (*PS_Unicodes_CharNextFunc)( PS_Unicodes unicodes, + FT_UInt32 *unicode ); + + + FT_DEFINE_SERVICE( PsCMaps ) + { + PS_Unicode_ValueFunc unicode_value; + + PS_Unicodes_InitFunc unicodes_init; + PS_Unicodes_CharIndexFunc unicodes_char_index; + PS_Unicodes_CharNextFunc unicodes_char_next; + + PS_Macintosh_NameFunc macintosh_name; + PS_Adobe_Std_StringsFunc adobe_std_strings; + const unsigned short* adobe_std_encoding; + const unsigned short* adobe_expert_encoding; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPSCMAP_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/services/svpsinfo.h b/libIGraph/include/freetype/internal/services/svpsinfo.h new file mode 100644 index 0000000..1033485 --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svpsinfo.h @@ -0,0 +1,60 @@ +/***************************************************************************/ +/* */ +/* svpsinfo.h */ +/* */ +/* The FreeType PostScript info service (specification). */ +/* */ +/* Copyright 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVPSINFO_H__ +#define __SVPSINFO_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_INTERNAL_TYPE1_TYPES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_POSTSCRIPT_INFO "postscript-info" + + + typedef FT_Error + (*PS_GetFontInfoFunc)( FT_Face face, + PS_FontInfoRec* afont_info ); + + typedef FT_Int + (*PS_HasGlyphNamesFunc)( FT_Face face ); + + typedef FT_Error + (*PS_GetFontPrivateFunc)( FT_Face face, + PS_PrivateRec* afont_private ); + + + FT_DEFINE_SERVICE( PsInfo ) + { + PS_GetFontInfoFunc ps_get_font_info; + PS_HasGlyphNamesFunc ps_has_glyph_names; + PS_GetFontPrivateFunc ps_get_font_private; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVPSINFO_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/services/svsfnt.h b/libIGraph/include/freetype/internal/services/svsfnt.h new file mode 100644 index 0000000..e11d537 --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svsfnt.h @@ -0,0 +1,80 @@ +/***************************************************************************/ +/* */ +/* svsfnt.h */ +/* */ +/* The FreeType SFNT table loading service (specification). */ +/* */ +/* Copyright 2003, 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVSFNT_H__ +#define __SVSFNT_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + + /* + * SFNT table loading service. + */ + +#define FT_SERVICE_ID_SFNT_TABLE "sfnt-table" + + + /* + * Used to implement FT_Load_Sfnt_Table(). + */ + typedef FT_Error + (*FT_SFNT_TableLoadFunc)( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + /* + * Used to implement FT_Get_Sfnt_Table(). + */ + typedef void* + (*FT_SFNT_TableGetFunc)( FT_Face face, + FT_Sfnt_Tag tag ); + + + /* + * Used to implement FT_Sfnt_Table_Info(). + */ + typedef FT_Error + (*FT_SFNT_TableInfoFunc)( FT_Face face, + FT_UInt idx, + FT_ULong *tag, + FT_ULong *length ); + + + FT_DEFINE_SERVICE( SFNT_Table ) + { + FT_SFNT_TableLoadFunc load_table; + FT_SFNT_TableGetFunc get_table; + FT_SFNT_TableInfoFunc table_info; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVSFNT_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/services/svttcmap.h b/libIGraph/include/freetype/internal/services/svttcmap.h new file mode 100644 index 0000000..6bf02eb --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svttcmap.h @@ -0,0 +1,78 @@ +/***************************************************************************/ +/* */ +/* svsttcmap.h */ +/* */ +/* The FreeType TrueType/sfnt cmap extra information service. */ +/* */ +/* Copyright 2003 by */ +/* Masatake YAMATO, Redhat K.K. */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + +/* Development of this service is support of + Information-technology Promotion Agency, Japan. */ + +#ifndef __SVTTCMAP_H__ +#define __SVTTCMAP_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_TT_CMAP "tt-cmaps" + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_CMapInfo */ + /* */ + /* <Description> */ + /* A structure used to store TrueType/sfnt specific cmap information */ + /* which is not covered by the generic @FT_CharMap structure. This */ + /* structure can be accessed with the @FT_Get_TT_CMap_Info function. */ + /* */ + /* <Fields> */ + /* language :: */ + /* The language ID used in Mac fonts. Definitions of values are in */ + /* freetype/ttnameid.h. */ + /* */ + typedef struct TT_CMapInfo_ + { + FT_ULong language; + FT_Long format; + + } TT_CMapInfo; + + + typedef FT_Error + (*TT_CMap_Info_GetFunc)( FT_CharMap charmap, + TT_CMapInfo *cmap_info ); + + + FT_DEFINE_SERVICE( TTCMaps ) + { + TT_CMap_Info_GetFunc get_cmap_info; + }; + + /* */ + + +FT_END_HEADER + +#endif /* __SVTTCMAP_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/services/svtteng.h b/libIGraph/include/freetype/internal/services/svtteng.h new file mode 100644 index 0000000..3396c39 --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svtteng.h @@ -0,0 +1,53 @@ +/***************************************************************************/ +/* */ +/* svtteng.h */ +/* */ +/* The FreeType TrueType engine query service (specification). */ +/* */ +/* Copyright 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVTTENG_H__ +#define __SVTTENG_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + /* + * SFNT table loading service. + */ + +#define FT_SERVICE_ID_TRUETYPE_ENGINE "truetype-engine" + + /* + * Used to implement FT_Get_TrueType_Engine_Type + */ + + FT_DEFINE_SERVICE( TrueTypeEngine ) + { + FT_TrueTypeEngineType engine_type; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVTTENG_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/services/svttglyf.h b/libIGraph/include/freetype/internal/services/svttglyf.h new file mode 100644 index 0000000..482b922 --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svttglyf.h @@ -0,0 +1,48 @@ +/***************************************************************************/ +/* */ +/* svttglyf.h */ +/* */ +/* The FreeType TrueType glyph service. */ +/* */ +/* Copyright 2007 by David Turner. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + +#ifndef __SVTTGLYF_H__ +#define __SVTTGLYF_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_TRUETYPE_TABLES_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_TT_GLYF "tt-glyf" + + + typedef FT_ULong + (*TT_Glyf_GetLocationFunc)( FT_Face face, + FT_UInt gindex, + FT_ULong *psize ); + + FT_DEFINE_SERVICE( TTGlyf ) + { + TT_Glyf_GetLocationFunc get_location; + }; + + /* */ + + +FT_END_HEADER + +#endif /* __SVTTGLYF_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/services/svwinfnt.h b/libIGraph/include/freetype/internal/services/svwinfnt.h new file mode 100644 index 0000000..6fe00d3 --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svwinfnt.h @@ -0,0 +1,50 @@ +/***************************************************************************/ +/* */ +/* svwinfnt.h */ +/* */ +/* The FreeType Windows FNT/FONT service (specification). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVWINFNT_H__ +#define __SVWINFNT_H__ + +#include FT_INTERNAL_SERVICE_H +#include FT_WINFONTS_H + + +FT_BEGIN_HEADER + + +#define FT_SERVICE_ID_WINFNT "winfonts" + + typedef FT_Error + (*FT_WinFnt_GetHeaderFunc)( FT_Face face, + FT_WinFNT_HeaderRec *aheader ); + + + FT_DEFINE_SERVICE( WinFnt ) + { + FT_WinFnt_GetHeaderFunc get_header; + }; + + /* */ + + +FT_END_HEADER + + +#endif /* __SVWINFNT_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/services/svxf86nm.h b/libIGraph/include/freetype/internal/services/svxf86nm.h new file mode 100644 index 0000000..cd922a5 --- /dev/null +++ b/libIGraph/include/freetype/internal/services/svxf86nm.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* svxf86nm.h */ +/* */ +/* The FreeType XFree86 services (specification only). */ +/* */ +/* Copyright 2003 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __SVXF86NM_H__ +#define __SVXF86NM_H__ + +#include FT_INTERNAL_SERVICE_H + + +FT_BEGIN_HEADER + + + /* + * A trivial service used to return the name of a face's font driver, + * according to the XFree86 nomenclature. Note that the service data + * is a simple constant string pointer. + */ + +#define FT_SERVICE_ID_XF86_NAME "xf86-driver-name" + +#define FT_XF86_FORMAT_TRUETYPE "TrueType" +#define FT_XF86_FORMAT_TYPE_1 "Type 1" +#define FT_XF86_FORMAT_BDF "BDF" +#define FT_XF86_FORMAT_PCF "PCF" +#define FT_XF86_FORMAT_TYPE_42 "Type 42" +#define FT_XF86_FORMAT_CID "CID Type 1" +#define FT_XF86_FORMAT_CFF "CFF" +#define FT_XF86_FORMAT_PFR "PFR" +#define FT_XF86_FORMAT_WINFNT "Windows FNT" + + /* */ + + +FT_END_HEADER + + +#endif /* __SVXF86NM_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/sfnt.h b/libIGraph/include/freetype/internal/sfnt.h new file mode 100644 index 0000000..9b47a8e --- /dev/null +++ b/libIGraph/include/freetype/internal/sfnt.h @@ -0,0 +1,762 @@ +/***************************************************************************/ +/* */ +/* sfnt.h */ +/* */ +/* High-level `sfnt' driver interface (specification). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __SFNT_H__ +#define __SFNT_H__ + + +#include <ft2build.h> +#include FT_INTERNAL_DRIVER_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Init_Face_Func */ + /* */ + /* <Description> */ + /* First part of the SFNT face object initialization. This finds */ + /* the face in a SFNT file or collection, and load its format tag in */ + /* face->format_tag. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* face_index :: The index of the TrueType font, if we are opening a */ + /* collection. */ + /* */ + /* num_params :: The number of additional parameters. */ + /* */ + /* params :: Optional additional parameters. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be at the font file's origin. */ + /* */ + /* This function recognizes fonts embedded in a `TrueType */ + /* collection'. */ + /* */ + /* Once the format tag has been validated by the font driver, it */ + /* should then call the TT_Load_Face_Func() callback to read the rest */ + /* of the SFNT tables in the object. */ + /* */ + typedef FT_Error + (*TT_Init_Face_Func)( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Face_Func */ + /* */ + /* <Description> */ + /* Second part of the SFNT face object initialization. This loads */ + /* the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the */ + /* face object. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* face_index :: The index of the TrueType font, if we are opening a */ + /* collection. */ + /* */ + /* num_params :: The number of additional parameters. */ + /* */ + /* params :: Optional additional parameters. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function must be called after TT_Init_Face_Func(). */ + /* */ + typedef FT_Error + (*TT_Load_Face_Func)( FT_Stream stream, + TT_Face face, + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Done_Face_Func */ + /* */ + /* <Description> */ + /* A callback used to delete the common SFNT data from a face. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* <Note> */ + /* This function does NOT destroy the face object. */ + /* */ + typedef void + (*TT_Done_Face_Func)( TT_Face face ); + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_SFNT_HeaderRec_Func */ + /* */ + /* <Description> */ + /* Loads the header of a SFNT font file. Supports collections. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* face_index :: The index of the TrueType font, if we are opening a */ + /* collection. */ + /* */ + /* <Output> */ + /* sfnt :: The SFNT header. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be at the font file's origin. */ + /* */ + /* This function recognizes fonts embedded in a `TrueType */ + /* collection'. */ + /* */ + /* This function checks that the header is valid by looking at the */ + /* values of `search_range', `entry_selector', and `range_shift'. */ + /* */ + typedef FT_Error + (*TT_Load_SFNT_HeaderRec_Func)( TT_Face face, + FT_Stream stream, + FT_Long face_index, + SFNT_Header sfnt ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Directory_Func */ + /* */ + /* <Description> */ + /* Loads the table directory into a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* sfnt :: The SFNT header. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be on the first byte after the 4-byte font */ + /* format tag. This is the case just after a call to */ + /* TT_Load_Format_Tag(). */ + /* */ + typedef FT_Error + (*TT_Load_Directory_Func)( TT_Face face, + FT_Stream stream, + SFNT_Header sfnt ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Any_Func */ + /* */ + /* <Description> */ + /* Load any font table into client memory. */ + /* */ + /* <Input> */ + /* face :: The face object to look for. */ + /* */ + /* tag :: The tag of table to load. Use the value 0 if you want */ + /* to access the whole font file, else set this parameter */ + /* to a valid TrueType table tag that you can forge with */ + /* the MAKE_TT_TAG macro. */ + /* */ + /* offset :: The starting offset in the table (or the file if */ + /* tag == 0). */ + /* */ + /* length :: The address of the decision variable: */ + /* */ + /* If length == NULL: */ + /* Loads the whole table. Returns an error if */ + /* `offset' == 0! */ + /* */ + /* If *length == 0: */ + /* Exits immediately; returning the length of the given */ + /* table or of the font file, depending on the value of */ + /* `tag'. */ + /* */ + /* If *length != 0: */ + /* Loads the next `length' bytes of table or font, */ + /* starting at offset `offset' (in table or font too). */ + /* */ + /* <Output> */ + /* buffer :: The address of target buffer. */ + /* */ + /* <Return> */ + /* TrueType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Load_Any_Func)( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte *buffer, + FT_ULong* length ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Find_SBit_Image_Func */ + /* */ + /* <Description> */ + /* Check whether an embedded bitmap (an `sbit') exists for a given */ + /* glyph, at a given strike. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* glyph_index :: The glyph index. */ + /* */ + /* strike_index :: The current strike index. */ + /* */ + /* <Output> */ + /* arange :: The SBit range containing the glyph index. */ + /* */ + /* astrike :: The SBit strike containing the glyph index. */ + /* */ + /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns */ + /* SFNT_Err_Invalid_Argument if no sbit exists for the requested */ + /* glyph. */ + /* */ + typedef FT_Error + (*TT_Find_SBit_Image_Func)( TT_Face face, + FT_UInt glyph_index, + FT_ULong strike_index, + TT_SBit_Range *arange, + TT_SBit_Strike *astrike, + FT_ULong *aglyph_offset ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_SBit_Metrics_Func */ + /* */ + /* <Description> */ + /* Get the big metrics for a given embedded bitmap. */ + /* */ + /* <Input> */ + /* stream :: The input stream. */ + /* */ + /* range :: The SBit range containing the glyph. */ + /* */ + /* <Output> */ + /* big_metrics :: A big SBit metrics structure for the glyph. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be positioned at the glyph's offset within */ + /* the `EBDT' table before the call. */ + /* */ + /* If the image format uses variable metrics, the stream cursor is */ + /* positioned just after the metrics header in the `EBDT' table on */ + /* function exit. */ + /* */ + typedef FT_Error + (*TT_Load_SBit_Metrics_Func)( FT_Stream stream, + TT_SBit_Range range, + TT_SBit_Metrics metrics ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_SBit_Image_Func */ + /* */ + /* <Description> */ + /* Load a given glyph sbit image from the font resource. This also */ + /* returns its metrics. */ + /* */ + /* <Input> */ + /* face :: */ + /* The target face object. */ + /* */ + /* strike_index :: */ + /* The strike index. */ + /* */ + /* glyph_index :: */ + /* The current glyph index. */ + /* */ + /* load_flags :: */ + /* The current load flags. */ + /* */ + /* stream :: */ + /* The input stream. */ + /* */ + /* <Output> */ + /* amap :: */ + /* The target pixmap. */ + /* */ + /* ametrics :: */ + /* A big sbit metrics structure for the glyph image. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* glyph sbit exists for the index. */ + /* */ + /* <Note> */ + /* The `map.buffer' field is always freed before the glyph is loaded. */ + /* */ + typedef FT_Error + (*TT_Load_SBit_Image_Func)( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *amap, + TT_SBit_MetricsRec *ametrics ); + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Set_SBit_Strike_OldFunc */ + /* */ + /* <Description> */ + /* Select an sbit strike for a given size request. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* req :: The size request. */ + /* */ + /* <Output> */ + /* astrike_index :: The index of the sbit strike. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* sbit strike exists for the selected ppem values. */ + /* */ + typedef FT_Error + (*TT_Set_SBit_Strike_OldFunc)( TT_Face face, + FT_UInt x_ppem, + FT_UInt y_ppem, + FT_ULong* astrike_index ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_CharMap_Load_Func */ + /* */ + /* <Description> */ + /* Loads a given TrueType character map into memory. */ + /* */ + /* <Input> */ + /* face :: A handle to the parent face object. */ + /* */ + /* stream :: A handle to the current stream object. */ + /* */ + /* <InOut> */ + /* cmap :: A pointer to a cmap object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The function assumes that the stream is already in use (i.e., */ + /* opened). In case of error, all partially allocated tables are */ + /* released. */ + /* */ + typedef FT_Error + (*TT_CharMap_Load_Func)( TT_Face face, + void* cmap, + FT_Stream input ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_CharMap_Free_Func */ + /* */ + /* <Description> */ + /* Destroys a character mapping table. */ + /* */ + /* <Input> */ + /* face :: A handle to the parent face object. */ + /* */ + /* cmap :: A handle to a cmap object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_CharMap_Free_Func)( TT_Face face, + void* cmap ); + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Set_SBit_Strike_Func */ + /* */ + /* <Description> */ + /* Select an sbit strike for a given size request. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* req :: The size request. */ + /* */ + /* <Output> */ + /* astrike_index :: The index of the sbit strike. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* sbit strike exists for the selected ppem values. */ + /* */ + typedef FT_Error + (*TT_Set_SBit_Strike_Func)( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Strike_Metrics_Func */ + /* */ + /* <Description> */ + /* Load the metrics of a given strike. */ + /* */ + /* <Input> */ + /* face :: The target face object. */ + /* */ + /* strike_index :: The strike index. */ + /* */ + /* <Output> */ + /* metrics :: the metrics of the strike. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. Returns an error if no */ + /* such sbit strike exists. */ + /* */ + typedef FT_Error + (*TT_Load_Strike_Metrics_Func)( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Get_PS_Name_Func */ + /* */ + /* <Description> */ + /* Get the PostScript glyph name of a glyph. */ + /* */ + /* <Input> */ + /* idx :: The glyph index. */ + /* */ + /* PSname :: The address of a string pointer. Will be NULL in case */ + /* of error, otherwise it is a pointer to the glyph name. */ + /* */ + /* You must not modify the returned string! */ + /* */ + /* <Output> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Get_PS_Name_Func)( TT_Face face, + FT_UInt idx, + FT_String** PSname ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Metrics_Func */ + /* */ + /* <Description> */ + /* Load a metrics table, which is a table with a horizontal and a */ + /* vertical version. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load the vertical one. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Load_Metrics_Func)( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Get_Metrics_Func */ + /* */ + /* <Description> */ + /* Load the horizontal or vertical header in a face object. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load vertical metrics. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Get_Metrics_Func)( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short* abearing, + FT_UShort* aadvance ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Load_Table_Func */ + /* */ + /* <Description> */ + /* Load a given TrueType table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The function uses `face->goto_table' to seek the stream to the */ + /* start of the table, except while loading the font directory. */ + /* */ + typedef FT_Error + (*TT_Load_Table_Func)( TT_Face face, + FT_Stream stream ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Free_Table_Func */ + /* */ + /* <Description> */ + /* Free a given TrueType table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + typedef void + (*TT_Free_Table_Func)( TT_Face face ); + + + /* + * @functype: + * TT_Face_GetKerningFunc + * + * @description: + * Return the horizontal kerning value between two glyphs. + * + * @input: + * face :: A handle to the source face object. + * left_glyph :: The left glyph index. + * right_glyph :: The right glyph index. + * + * @return: + * The kerning value in font units. + */ + typedef FT_Int + (*TT_Face_GetKerningFunc)( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ); + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* SFNT_Interface */ + /* */ + /* <Description> */ + /* This structure holds pointers to the functions used to load and */ + /* free the basic tables that are required in a `sfnt' font file. */ + /* */ + /* <Fields> */ + /* Check the various xxx_Func() descriptions for details. */ + /* */ + typedef struct SFNT_Interface_ + { + TT_Loader_GotoTableFunc goto_table; + + TT_Init_Face_Func init_face; + TT_Load_Face_Func load_face; + TT_Done_Face_Func done_face; + FT_Module_Requester get_interface; + + TT_Load_Any_Func load_any; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_Load_SFNT_HeaderRec_Func load_sfnt_header; + TT_Load_Directory_Func load_directory; +#endif + + /* these functions are called by `load_face' but they can also */ + /* be called from external modules, if there is a need to do so */ + TT_Load_Table_Func load_head; + TT_Load_Metrics_Func load_hhea; + TT_Load_Table_Func load_cmap; + TT_Load_Table_Func load_maxp; + TT_Load_Table_Func load_os2; + TT_Load_Table_Func load_post; + + TT_Load_Table_Func load_name; + TT_Free_Table_Func free_name; + + /* optional tables */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_Load_Table_Func load_hdmx_stub; + TT_Free_Table_Func free_hdmx_stub; +#endif + + /* this field was called `load_kerning' up to version 2.1.10 */ + TT_Load_Table_Func load_kern; + + TT_Load_Table_Func load_gasp; + TT_Load_Table_Func load_pclt; + + /* see `ttload.h'; this field was called `load_bitmap_header' up to */ + /* version 2.1.10 */ + TT_Load_Table_Func load_bhed; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /* see `ttsbit.h' */ + TT_Set_SBit_Strike_OldFunc set_sbit_strike_stub; + TT_Load_Table_Func load_sbits_stub; + + /* + * The following two fields appeared in version 2.1.8, and were placed + * between `load_sbits' and `load_sbit_image'. We support them as a + * special exception since they are used by Xfont library within the + * X.Org xserver, and because the probability that other rogue clients + * use the other version 2.1.7 fields below is _extremely_ low. + * + * Note that this forces us to disable an interesting memory-saving + * optimization though... + */ + + TT_Find_SBit_Image_Func find_sbit_image; + TT_Load_SBit_Metrics_Func load_sbit_metrics; + +#endif + + TT_Load_SBit_Image_Func load_sbit_image; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_Free_Table_Func free_sbits_stub; +#endif + + /* see `ttpost.h' */ + TT_Get_PS_Name_Func get_psname; + TT_Free_Table_Func free_psnames; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_CharMap_Load_Func load_charmap_stub; + TT_CharMap_Free_Func free_charmap_stub; +#endif + + /* starting here, the structure differs from version 2.1.7 */ + + /* this field was introduced in version 2.1.8, named `get_psname' */ + TT_Face_GetKerningFunc get_kerning; + + /* new elements introduced after version 2.1.10 */ + + /* load the font directory, i.e., the offset table and */ + /* the table directory */ + TT_Load_Table_Func load_font_dir; + TT_Load_Metrics_Func load_hmtx; + + TT_Load_Table_Func load_eblc; + TT_Free_Table_Func free_eblc; + + TT_Set_SBit_Strike_Func set_sbit_strike; + TT_Load_Strike_Metrics_Func load_strike_metrics; + + TT_Get_Metrics_Func get_metrics; + + } SFNT_Interface; + + + /* transitional */ + typedef SFNT_Interface* SFNT_Service; + + +FT_END_HEADER + +#endif /* __SFNT_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/t1types.h b/libIGraph/include/freetype/internal/t1types.h new file mode 100644 index 0000000..c8b755d --- /dev/null +++ b/libIGraph/include/freetype/internal/t1types.h @@ -0,0 +1,252 @@ +/***************************************************************************/ +/* */ +/* t1types.h */ +/* */ +/* Basic Type1/Type2 type definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1TYPES_H__ +#define __T1TYPES_H__ + + +#include <ft2build.h> +#include FT_TYPE1_TABLES_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* T1_EncodingRec */ + /* */ + /* <Description> */ + /* A structure modeling a custom encoding. */ + /* */ + /* <Fields> */ + /* num_chars :: The number of character codes in the encoding. */ + /* Usually 256. */ + /* */ + /* code_first :: The lowest valid character code in the encoding. */ + /* */ + /* code_last :: The highest valid character code in the encoding. */ + /* */ + /* char_index :: An array of corresponding glyph indices. */ + /* */ + /* char_name :: An array of corresponding glyph names. */ + /* */ + typedef struct T1_EncodingRecRec_ + { + FT_Int num_chars; + FT_Int code_first; + FT_Int code_last; + + FT_UShort* char_index; + FT_String** char_name; + + } T1_EncodingRec, *T1_Encoding; + + + typedef enum T1_EncodingType_ + { + T1_ENCODING_TYPE_NONE = 0, + T1_ENCODING_TYPE_ARRAY, + T1_ENCODING_TYPE_STANDARD, + T1_ENCODING_TYPE_ISOLATIN1, + T1_ENCODING_TYPE_EXPERT + + } T1_EncodingType; + + + typedef struct T1_FontRec_ + { + PS_FontInfoRec font_info; /* font info dictionary */ + PS_PrivateRec private_dict; /* private dictionary */ + FT_String* font_name; /* top-level dictionary */ + + T1_EncodingType encoding_type; + T1_EncodingRec encoding; + + FT_Byte* subrs_block; + FT_Byte* charstrings_block; + FT_Byte* glyph_names_block; + + FT_Int num_subrs; + FT_Byte** subrs; + FT_PtrDist* subrs_len; + + FT_Int num_glyphs; + FT_String** glyph_names; /* array of glyph names */ + FT_Byte** charstrings; /* array of glyph charstrings */ + FT_PtrDist* charstrings_len; + + FT_Byte paint_type; + FT_Byte font_type; + FT_Matrix font_matrix; + FT_Vector font_offset; + FT_BBox font_bbox; + FT_Long font_id; + + FT_Fixed stroke_width; + + } T1_FontRec, *T1_Font; + + + typedef struct CID_SubrsRec_ + { + FT_UInt num_subrs; + FT_Byte** code; + + } CID_SubrsRec, *CID_Subrs; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** AFM FONT INFORMATION STRUCTURES ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AFM_TrackKernRec_ + { + FT_Int degree; + FT_Fixed min_ptsize; + FT_Fixed min_kern; + FT_Fixed max_ptsize; + FT_Fixed max_kern; + + } AFM_TrackKernRec, *AFM_TrackKern; + + typedef struct AFM_KernPairRec_ + { + FT_Int index1; + FT_Int index2; + FT_Int x; + FT_Int y; + + } AFM_KernPairRec, *AFM_KernPair; + + typedef struct AFM_FontInfoRec_ + { + FT_Bool IsCIDFont; + FT_BBox FontBBox; + FT_Fixed Ascender; + FT_Fixed Descender; + AFM_TrackKern TrackKerns; /* free if non-NULL */ + FT_Int NumTrackKern; + AFM_KernPair KernPairs; /* free if non-NULL */ + FT_Int NumKernPair; + + } AFM_FontInfoRec, *AFM_FontInfo; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** ORIGINAL T1_FACE CLASS DEFINITION ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct T1_FaceRec_* T1_Face; + typedef struct CID_FaceRec_* CID_Face; + + + typedef struct T1_FaceRec_ + { + FT_FaceRec root; + T1_FontRec type1; + const void* psnames; + const void* psaux; + const void* afm_data; + FT_CharMapRec charmaprecs[2]; + FT_CharMap charmaps[2]; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + PS_Unicodes unicode_map; +#endif + + /* support for Multiple Masters fonts */ + PS_Blend blend; + + /* undocumented, optional: indices of subroutines that express */ + /* the NormalizeDesignVector and the ConvertDesignVector procedure, */ + /* respectively, as Type 2 charstrings; -1 if keywords not present */ + FT_Int ndv_idx; + FT_Int cdv_idx; + + /* undocumented, optional: has the same meaning as len_buildchar */ + /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25 */ + FT_UInt len_buildchar; + FT_Int* buildchar; + + /* since version 2.1 - interface to PostScript hinter */ + const void* pshinter; + + } T1_FaceRec; + + + typedef struct CID_FaceRec_ + { + FT_FaceRec root; + void* psnames; + void* psaux; + CID_FaceInfoRec cid; + void* afm_data; + CID_Subrs subrs; + + /* since version 2.1 - interface to PostScript hinter */ + void* pshinter; + + /* since version 2.1.8, but was originally positioned after `afm_data' */ + FT_Byte* binary_data; /* used if hex data has been converted */ + FT_Stream cid_stream; + + } CID_FaceRec; + + +FT_END_HEADER + +#endif /* __T1TYPES_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/internal/tttypes.h b/libIGraph/include/freetype/internal/tttypes.h new file mode 100644 index 0000000..b307882 --- /dev/null +++ b/libIGraph/include/freetype/internal/tttypes.h @@ -0,0 +1,1543 @@ +/***************************************************************************/ +/* */ +/* tttypes.h */ +/* */ +/* Basic SFNT/TrueType type definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTTYPES_H__ +#define __TTTYPES_H__ + + +#include <ft2build.h> +#include FT_TRUETYPE_TABLES_H +#include FT_INTERNAL_OBJECTS_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TTC_HeaderRec */ + /* */ + /* <Description> */ + /* TrueType collection header. This table contains the offsets of */ + /* the font headers of each distinct TrueType face in the file. */ + /* */ + /* <Fields> */ + /* tag :: Must be `ttc ' to indicate a TrueType collection. */ + /* */ + /* version :: The version number. */ + /* */ + /* count :: The number of faces in the collection. The */ + /* specification says this should be an unsigned long, but */ + /* we use a signed long since we need the value -1 for */ + /* specific purposes. */ + /* */ + /* offsets :: The offsets of the font headers, one per face. */ + /* */ + typedef struct TTC_HeaderRec_ + { + FT_ULong tag; + FT_Fixed version; + FT_Long count; + FT_ULong* offsets; + + } TTC_HeaderRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* SFNT_HeaderRec */ + /* */ + /* <Description> */ + /* SFNT file format header. */ + /* */ + /* <Fields> */ + /* format_tag :: The font format tag. */ + /* */ + /* num_tables :: The number of tables in file. */ + /* */ + /* search_range :: Must be `16 * (max power of 2 <= num_tables)'. */ + /* */ + /* entry_selector :: Must be log2 of `search_range / 16'. */ + /* */ + /* range_shift :: Must be `num_tables * 16 - search_range'. */ + /* */ + typedef struct SFNT_HeaderRec_ + { + FT_ULong format_tag; + FT_UShort num_tables; + FT_UShort search_range; + FT_UShort entry_selector; + FT_UShort range_shift; + + FT_ULong offset; /* not in file */ + + } SFNT_HeaderRec, *SFNT_Header; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_TableRec */ + /* */ + /* <Description> */ + /* This structure describes a given table of a TrueType font. */ + /* */ + /* <Fields> */ + /* Tag :: A four-bytes tag describing the table. */ + /* */ + /* CheckSum :: The table checksum. This value can be ignored. */ + /* */ + /* Offset :: The offset of the table from the start of the TrueType */ + /* font in its resource. */ + /* */ + /* Length :: The table length (in bytes). */ + /* */ + typedef struct TT_TableRec_ + { + FT_ULong Tag; /* table type */ + FT_ULong CheckSum; /* table checksum */ + FT_ULong Offset; /* table file offset */ + FT_ULong Length; /* table length */ + + } TT_TableRec, *TT_Table; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_LongMetricsRec */ + /* */ + /* <Description> */ + /* A structure modeling the long metrics of the `hmtx' and `vmtx' */ + /* TrueType tables. The values are expressed in font units. */ + /* */ + /* <Fields> */ + /* advance :: The advance width or height for the glyph. */ + /* */ + /* bearing :: The left-side or top-side bearing for the glyph. */ + /* */ + typedef struct TT_LongMetricsRec_ + { + FT_UShort advance; + FT_Short bearing; + + } TT_LongMetricsRec, *TT_LongMetrics; + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* TT_ShortMetrics */ + /* */ + /* <Description> */ + /* A simple type to model the short metrics of the `hmtx' and `vmtx' */ + /* tables. */ + /* */ + typedef FT_Short TT_ShortMetrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_NameEntryRec */ + /* */ + /* <Description> */ + /* A structure modeling TrueType name records. Name records are used */ + /* to store important strings like family name, style name, */ + /* copyright, etc. in _localized_ versions (i.e., language, encoding, */ + /* etc). */ + /* */ + /* <Fields> */ + /* platformID :: The ID of the name's encoding platform. */ + /* */ + /* encodingID :: The platform-specific ID for the name's encoding. */ + /* */ + /* languageID :: The platform-specific ID for the name's language. */ + /* */ + /* nameID :: The ID specifying what kind of name this is. */ + /* */ + /* stringLength :: The length of the string in bytes. */ + /* */ + /* stringOffset :: The offset to the string in the `name' table. */ + /* */ + /* string :: A pointer to the string's bytes. Note that these */ + /* are usually UTF-16 encoded characters. */ + /* */ + typedef struct TT_NameEntryRec_ + { + FT_UShort platformID; + FT_UShort encodingID; + FT_UShort languageID; + FT_UShort nameID; + FT_UShort stringLength; + FT_ULong stringOffset; + + /* this last field is not defined in the spec */ + /* but used by the FreeType engine */ + + FT_Byte* string; + + } TT_NameEntryRec, *TT_NameEntry; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_NameTableRec */ + /* */ + /* <Description> */ + /* A structure modeling the TrueType name table. */ + /* */ + /* <Fields> */ + /* format :: The format of the name table. */ + /* */ + /* numNameRecords :: The number of names in table. */ + /* */ + /* storageOffset :: The offset of the name table in the `name' */ + /* TrueType table. */ + /* */ + /* names :: An array of name records. */ + /* */ + /* stream :: the file's input stream. */ + /* */ + typedef struct TT_NameTableRec_ + { + FT_UShort format; + FT_UInt numNameRecords; + FT_UInt storageOffset; + TT_NameEntryRec* names; + FT_Stream stream; + + } TT_NameTableRec, *TT_NameTable; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_GaspRangeRec */ + /* */ + /* <Description> */ + /* A tiny structure used to model a gasp range according to the */ + /* TrueType specification. */ + /* */ + /* <Fields> */ + /* maxPPEM :: The maximum ppem value to which `gaspFlag' applies. */ + /* */ + /* gaspFlag :: A flag describing the grid-fitting and anti-aliasing */ + /* modes to be used. */ + /* */ + typedef struct TT_GaspRangeRec_ + { + FT_UShort maxPPEM; + FT_UShort gaspFlag; + + } TT_GaspRangeRec, *TT_GaspRange; + + +#define TT_GASP_GRIDFIT 0x01 +#define TT_GASP_DOGRAY 0x02 + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_GaspRec */ + /* */ + /* <Description> */ + /* A structure modeling the TrueType `gasp' table used to specify */ + /* grid-fitting and anti-aliasing behaviour. */ + /* */ + /* <Fields> */ + /* version :: The version number. */ + /* */ + /* numRanges :: The number of gasp ranges in table. */ + /* */ + /* gaspRanges :: An array of gasp ranges. */ + /* */ + typedef struct TT_Gasp_ + { + FT_UShort version; + FT_UShort numRanges; + TT_GaspRange gaspRanges; + + } TT_GaspRec; + + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_HdmxEntryRec */ + /* */ + /* <Description> */ + /* A small structure used to model the pre-computed widths of a given */ + /* size. They are found in the `hdmx' table. */ + /* */ + /* <Fields> */ + /* ppem :: The pixels per EM value at which these metrics apply. */ + /* */ + /* max_width :: The maximum advance width for this metric. */ + /* */ + /* widths :: An array of widths. Note: These are 8-bit bytes. */ + /* */ + typedef struct TT_HdmxEntryRec_ + { + FT_Byte ppem; + FT_Byte max_width; + FT_Byte* widths; + + } TT_HdmxEntryRec, *TT_HdmxEntry; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_HdmxRec */ + /* */ + /* <Description> */ + /* A structure used to model the `hdmx' table, which contains */ + /* pre-computed widths for a set of given sizes/dimensions. */ + /* */ + /* <Fields> */ + /* version :: The version number. */ + /* */ + /* num_records :: The number of hdmx records. */ + /* */ + /* records :: An array of hdmx records. */ + /* */ + typedef struct TT_HdmxRec_ + { + FT_UShort version; + FT_Short num_records; + TT_HdmxEntry records; + + } TT_HdmxRec, *TT_Hdmx; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Kern0_PairRec */ + /* */ + /* <Description> */ + /* A structure used to model a kerning pair for the kerning table */ + /* format 0. The engine now loads this table if it finds one in the */ + /* font file. */ + /* */ + /* <Fields> */ + /* left :: The index of the left glyph in pair. */ + /* */ + /* right :: The index of the right glyph in pair. */ + /* */ + /* value :: The kerning distance. A positive value spaces the */ + /* glyphs, a negative one makes them closer. */ + /* */ + typedef struct TT_Kern0_PairRec_ + { + FT_UShort left; /* index of left glyph in pair */ + FT_UShort right; /* index of right glyph in pair */ + FT_FWord value; /* kerning value */ + + } TT_Kern0_PairRec, *TT_Kern0_Pair; + +#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** EMBEDDED BITMAPS SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_MetricsRec */ + /* */ + /* <Description> */ + /* A structure used to hold the big metrics of a given glyph bitmap */ + /* in a TrueType or OpenType font. These are usually found in the */ + /* `EBDT' (Microsoft) or `bloc' (Apple) table. */ + /* */ + /* <Fields> */ + /* height :: The glyph height in pixels. */ + /* */ + /* width :: The glyph width in pixels. */ + /* */ + /* horiBearingX :: The horizontal left bearing. */ + /* */ + /* horiBearingY :: The horizontal top bearing. */ + /* */ + /* horiAdvance :: The horizontal advance. */ + /* */ + /* vertBearingX :: The vertical left bearing. */ + /* */ + /* vertBearingY :: The vertical top bearing. */ + /* */ + /* vertAdvance :: The vertical advance. */ + /* */ + typedef struct TT_SBit_MetricsRec_ + { + FT_Byte height; + FT_Byte width; + + FT_Char horiBearingX; + FT_Char horiBearingY; + FT_Byte horiAdvance; + + FT_Char vertBearingX; + FT_Char vertBearingY; + FT_Byte vertAdvance; + + } TT_SBit_MetricsRec, *TT_SBit_Metrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_SmallMetricsRec */ + /* */ + /* <Description> */ + /* A structure used to hold the small metrics of a given glyph bitmap */ + /* in a TrueType or OpenType font. These are usually found in the */ + /* `EBDT' (Microsoft) or the `bdat' (Apple) table. */ + /* */ + /* <Fields> */ + /* height :: The glyph height in pixels. */ + /* */ + /* width :: The glyph width in pixels. */ + /* */ + /* bearingX :: The left-side bearing. */ + /* */ + /* bearingY :: The top-side bearing. */ + /* */ + /* advance :: The advance width or height. */ + /* */ + typedef struct TT_SBit_Small_Metrics_ + { + FT_Byte height; + FT_Byte width; + + FT_Char bearingX; + FT_Char bearingY; + FT_Byte advance; + + } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_LineMetricsRec */ + /* */ + /* <Description> */ + /* A structure used to describe the text line metrics of a given */ + /* bitmap strike, for either a horizontal or vertical layout. */ + /* */ + /* <Fields> */ + /* ascender :: The ascender in pixels. */ + /* */ + /* descender :: The descender in pixels. */ + /* */ + /* max_width :: The maximum glyph width in pixels. */ + /* */ + /* caret_slope_enumerator :: Rise of the caret slope, typically set */ + /* to 1 for non-italic fonts. */ + /* */ + /* caret_slope_denominator :: Rise of the caret slope, typically set */ + /* to 0 for non-italic fonts. */ + /* */ + /* caret_offset :: Offset in pixels to move the caret for */ + /* proper positioning. */ + /* */ + /* min_origin_SB :: Minimum of horiBearingX (resp. */ + /* vertBearingY). */ + /* min_advance_SB :: Minimum of */ + /* */ + /* horizontal advance - */ + /* ( horiBearingX + width ) */ + /* */ + /* resp. */ + /* */ + /* vertical advance - */ + /* ( vertBearingY + height ) */ + /* */ + /* max_before_BL :: Maximum of horiBearingY (resp. */ + /* vertBearingY). */ + /* */ + /* min_after_BL :: Minimum of */ + /* */ + /* horiBearingY - height */ + /* */ + /* resp. */ + /* */ + /* vertBearingX - width */ + /* */ + /* pads :: Unused (to make the size of the record */ + /* a multiple of 32 bits. */ + /* */ + typedef struct TT_SBit_LineMetricsRec_ + { + FT_Char ascender; + FT_Char descender; + FT_Byte max_width; + FT_Char caret_slope_numerator; + FT_Char caret_slope_denominator; + FT_Char caret_offset; + FT_Char min_origin_SB; + FT_Char min_advance_SB; + FT_Char max_before_BL; + FT_Char min_after_BL; + FT_Char pads[2]; + + } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_RangeRec */ + /* */ + /* <Description> */ + /* A TrueType/OpenType subIndexTable as defined in the `EBLC' */ + /* (Microsoft) or `bloc' (Apple) tables. */ + /* */ + /* <Fields> */ + /* first_glyph :: The first glyph index in the range. */ + /* */ + /* last_glyph :: The last glyph index in the range. */ + /* */ + /* index_format :: The format of index table. Valid values are 1 */ + /* to 5. */ + /* */ + /* image_format :: The format of `EBDT' image data. */ + /* */ + /* image_offset :: The offset to image data in `EBDT'. */ + /* */ + /* image_size :: For index formats 2 and 5. This is the size in */ + /* bytes of each glyph bitmap. */ + /* */ + /* big_metrics :: For index formats 2 and 5. This is the big */ + /* metrics for each glyph bitmap. */ + /* */ + /* num_glyphs :: For index formats 4 and 5. This is the number of */ + /* glyphs in the code array. */ + /* */ + /* glyph_offsets :: For index formats 1 and 3. */ + /* */ + /* glyph_codes :: For index formats 4 and 5. */ + /* */ + /* table_offset :: The offset of the index table in the `EBLC' */ + /* table. Only used during strike loading. */ + /* */ + typedef struct TT_SBit_RangeRec + { + FT_UShort first_glyph; + FT_UShort last_glyph; + + FT_UShort index_format; + FT_UShort image_format; + FT_ULong image_offset; + + FT_ULong image_size; + TT_SBit_MetricsRec metrics; + FT_ULong num_glyphs; + + FT_ULong* glyph_offsets; + FT_UShort* glyph_codes; + + FT_ULong table_offset; + + } TT_SBit_RangeRec, *TT_SBit_Range; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_StrikeRec */ + /* */ + /* <Description> */ + /* A structure used describe a given bitmap strike in the `EBLC' */ + /* (Microsoft) or `bloc' (Apple) tables. */ + /* */ + /* <Fields> */ + /* num_index_ranges :: The number of index ranges. */ + /* */ + /* index_ranges :: An array of glyph index ranges. */ + /* */ + /* color_ref :: Unused. `color_ref' is put in for future */ + /* enhancements, but these fields are already */ + /* in use by other platforms (e.g. Newton). */ + /* For details, please see */ + /* */ + /* http://fonts.apple.com/ */ + /* TTRefMan/RM06/Chap6bloc.html */ + /* */ + /* hori :: The line metrics for horizontal layouts. */ + /* */ + /* vert :: The line metrics for vertical layouts. */ + /* */ + /* start_glyph :: The lowest glyph index for this strike. */ + /* */ + /* end_glyph :: The highest glyph index for this strike. */ + /* */ + /* x_ppem :: The number of horizontal pixels per EM. */ + /* */ + /* y_ppem :: The number of vertical pixels per EM. */ + /* */ + /* bit_depth :: The bit depth. Valid values are 1, 2, 4, */ + /* and 8. */ + /* */ + /* flags :: Is this a vertical or horizontal strike? For */ + /* details, please see */ + /* */ + /* http://fonts.apple.com/ */ + /* TTRefMan/RM06/Chap6bloc.html */ + /* */ + typedef struct TT_SBit_StrikeRec_ + { + FT_Int num_ranges; + TT_SBit_Range sbit_ranges; + FT_ULong ranges_offset; + + FT_ULong color_ref; + + TT_SBit_LineMetricsRec hori; + TT_SBit_LineMetricsRec vert; + + FT_UShort start_glyph; + FT_UShort end_glyph; + + FT_Byte x_ppem; + FT_Byte y_ppem; + + FT_Byte bit_depth; + FT_Char flags; + + } TT_SBit_StrikeRec, *TT_SBit_Strike; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_ComponentRec */ + /* */ + /* <Description> */ + /* A simple structure to describe a compound sbit element. */ + /* */ + /* <Fields> */ + /* glyph_code :: The element's glyph index. */ + /* */ + /* x_offset :: The element's left bearing. */ + /* */ + /* y_offset :: The element's top bearing. */ + /* */ + typedef struct TT_SBit_ComponentRec_ + { + FT_UShort glyph_code; + FT_Char x_offset; + FT_Char y_offset; + + } TT_SBit_ComponentRec, *TT_SBit_Component; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_SBit_ScaleRec */ + /* */ + /* <Description> */ + /* A structure used describe a given bitmap scaling table, as defined */ + /* in the `EBSC' table. */ + /* */ + /* <Fields> */ + /* hori :: The horizontal line metrics. */ + /* */ + /* vert :: The vertical line metrics. */ + /* */ + /* x_ppem :: The number of horizontal pixels per EM. */ + /* */ + /* y_ppem :: The number of vertical pixels per EM. */ + /* */ + /* x_ppem_substitute :: Substitution x_ppem value. */ + /* */ + /* y_ppem_substitute :: Substitution y_ppem value. */ + /* */ + typedef struct TT_SBit_ScaleRec_ + { + TT_SBit_LineMetricsRec hori; + TT_SBit_LineMetricsRec vert; + + FT_Byte x_ppem; + FT_Byte y_ppem; + + FT_Byte x_ppem_substitute; + FT_Byte y_ppem_substitute; + + } TT_SBit_ScaleRec, *TT_SBit_Scale; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** POSTSCRIPT GLYPH NAMES SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Post_20Rec */ + /* */ + /* <Description> */ + /* Postscript names sub-table, format 2.0. Stores the PS name of */ + /* each glyph in the font face. */ + /* */ + /* <Fields> */ + /* num_glyphs :: The number of named glyphs in the table. */ + /* */ + /* num_names :: The number of PS names stored in the table. */ + /* */ + /* glyph_indices :: The indices of the glyphs in the names arrays. */ + /* */ + /* glyph_names :: The PS names not in Mac Encoding. */ + /* */ + typedef struct TT_Post_20Rec_ + { + FT_UShort num_glyphs; + FT_UShort num_names; + FT_UShort* glyph_indices; + FT_Char** glyph_names; + + } TT_Post_20Rec, *TT_Post_20; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Post_25Rec */ + /* */ + /* <Description> */ + /* Postscript names sub-table, format 2.5. Stores the PS name of */ + /* each glyph in the font face. */ + /* */ + /* <Fields> */ + /* num_glyphs :: The number of glyphs in the table. */ + /* */ + /* offsets :: An array of signed offsets in a normal Mac */ + /* Postscript name encoding. */ + /* */ + typedef struct TT_Post_25_ + { + FT_UShort num_glyphs; + FT_Char* offsets; + + } TT_Post_25Rec, *TT_Post_25; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Post_NamesRec */ + /* */ + /* <Description> */ + /* Postscript names table, either format 2.0 or 2.5. */ + /* */ + /* <Fields> */ + /* loaded :: A flag to indicate whether the PS names are loaded. */ + /* */ + /* format_20 :: The sub-table used for format 2.0. */ + /* */ + /* format_25 :: The sub-table used for format 2.5. */ + /* */ + typedef struct TT_Post_NamesRec_ + { + FT_Bool loaded; + + union + { + TT_Post_20Rec format_20; + TT_Post_25Rec format_25; + + } names; + + } TT_Post_NamesRec, *TT_Post_Names; + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** GX VARIATION TABLE SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + typedef struct GX_BlendRec_ *GX_Blend; +#endif + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * These types are used to support a `BDF ' table that isn't part of the + * official TrueType specification. It is mainly used in SFNT-based + * bitmap fonts that were generated from a set of BDF fonts. + * + * The format of the table is as follows. + * + * USHORT version `BDF ' table version number, should be 0x0001. + * USHORT strikeCount Number of strikes (bitmap sizes) in this table. + * ULONG stringTable Offset (from start of BDF table) to string + * table. + * + * This is followed by an array of `strikeCount' descriptors, having the + * following format. + * + * USHORT ppem Vertical pixels per EM for this strike. + * USHORT numItems Number of items for this strike (properties and + * atoms). Maximum is 255. + * + * This array in turn is followed by `strikeCount' value sets. Each + * `value set' is an array of `numItems' items with the following format. + * + * ULONG item_name Offset in string table to item name. + * USHORT item_type The item type. Possible values are + * 0 => string (e.g., COMMENT) + * 1 => atom (e.g., FONT or even SIZE) + * 2 => int32 + * 3 => uint32 + * 0x10 => A flag to indicate a properties. This + * is ORed with the above values. + * ULONG item_value For strings => Offset into string table without + * the corresponding double quotes. + * For atoms => Offset into string table. + * For integers => Direct value. + * + * All strings in the string table consist of bytes and are + * zero-terminated. + * + */ + +#ifdef TT_CONFIG_OPTION_BDF + + typedef struct TT_BDFRec_ + { + FT_Byte* table; + FT_Byte* table_end; + FT_Byte* strings; + FT_UInt32 strings_size; + FT_UInt num_strikes; + FT_Bool loaded; + + } TT_BDFRec, *TT_BDF; + +#endif /* TT_CONFIG_OPTION_BDF */ + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** ***/ + /*** ORIGINAL TT_FACE CLASS DEFINITION ***/ + /*** ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This structure/class is defined here because it is common to the */ + /* following formats: TTF, OpenType-TT, and OpenType-CFF. */ + /* */ + /* Note, however, that the classes TT_Size and TT_GlyphSlot are not */ + /* shared between font drivers, and are thus defined in `ttobjs.h'. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Type> */ + /* TT_Face */ + /* */ + /* <Description> */ + /* A handle to a TrueType face/font object. A TT_Face encapsulates */ + /* the resolution and scaling independent parts of a TrueType font */ + /* resource. */ + /* */ + /* <Note> */ + /* The TT_Face structure is also used as a `parent class' for the */ + /* OpenType-CFF class (T2_Face). */ + /* */ + typedef struct TT_FaceRec_* TT_Face; + + + /* a function type used for the truetype bytecode interpreter hooks */ + typedef FT_Error + (*TT_Interpreter)( void* exec_context ); + + /* forward declaration */ + typedef struct TT_LoaderRec_* TT_Loader; + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_GotoTableFunc */ + /* */ + /* <Description> */ + /* Seeks a stream to the start of a given TrueType table. */ + /* */ + /* <Input> */ + /* face :: A handle to the target face object. */ + /* */ + /* tag :: A 4-byte tag used to name the table. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* <Output> */ + /* length :: The length of the table in bytes. Set to 0 if not */ + /* needed. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* The stream cursor must be at the font file's origin. */ + /* */ + typedef FT_Error + (*TT_Loader_GotoTableFunc)( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_StartGlyphFunc */ + /* */ + /* <Description> */ + /* Seeks a stream to the start of a given glyph element, and opens a */ + /* frame for it. */ + /* */ + /* <Input> */ + /* loader :: The current TrueType glyph loader object. */ + /* */ + /* glyph index :: The index of the glyph to access. */ + /* */ + /* offset :: The offset of the glyph according to the */ + /* `locations' table. */ + /* */ + /* byte_count :: The size of the frame in bytes. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + /* <Note> */ + /* This function is normally equivalent to FT_STREAM_SEEK(offset) */ + /* followed by FT_FRAME_ENTER(byte_count) with the loader's stream, */ + /* but alternative formats (e.g. compressed ones) might use something */ + /* different. */ + /* */ + typedef FT_Error + (*TT_Loader_StartGlyphFunc)( TT_Loader loader, + FT_UInt glyph_index, + FT_ULong offset, + FT_UInt byte_count ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_ReadGlyphFunc */ + /* */ + /* <Description> */ + /* Reads one glyph element (its header, a simple glyph, or a */ + /* composite) from the loader's current stream frame. */ + /* */ + /* <Input> */ + /* loader :: The current TrueType glyph loader object. */ + /* */ + /* <Return> */ + /* FreeType error code. 0 means success. */ + /* */ + typedef FT_Error + (*TT_Loader_ReadGlyphFunc)( TT_Loader loader ); + + + /*************************************************************************/ + /* */ + /* <FuncType> */ + /* TT_Loader_EndGlyphFunc */ + /* */ + /* <Description> */ + /* Closes the current loader stream frame for the glyph. */ + /* */ + /* <Input> */ + /* loader :: The current TrueType glyph loader object. */ + /* */ + typedef void + (*TT_Loader_EndGlyphFunc)( TT_Loader loader ); + + + /*************************************************************************/ + /* */ + /* TrueType Face Type */ + /* */ + /* <Struct> */ + /* TT_Face */ + /* */ + /* <Description> */ + /* The TrueType face class. These objects model the resolution and */ + /* point-size independent data found in a TrueType font file. */ + /* */ + /* <Fields> */ + /* root :: The base FT_Face structure, managed by the */ + /* base layer. */ + /* */ + /* ttc_header :: The TrueType collection header, used when */ + /* the file is a `ttc' rather than a `ttf'. */ + /* For ordinary font files, the field */ + /* `ttc_header.count' is set to 0. */ + /* */ + /* format_tag :: The font format tag. */ + /* */ + /* num_tables :: The number of TrueType tables in this font */ + /* file. */ + /* */ + /* dir_tables :: The directory of TrueType tables for this */ + /* font file. */ + /* */ + /* header :: The font's font header (`head' table). */ + /* Read on font opening. */ + /* */ + /* horizontal :: The font's horizontal header (`hhea' */ + /* table). This field also contains the */ + /* associated horizontal metrics table */ + /* (`hmtx'). */ + /* */ + /* max_profile :: The font's maximum profile table. Read on */ + /* font opening. Note that some maximum */ + /* values cannot be taken directly from this */ + /* table. We thus define additional fields */ + /* below to hold the computed maxima. */ + /* */ + /* vertical_info :: A boolean which is set when the font file */ + /* contains vertical metrics. If not, the */ + /* value of the `vertical' field is */ + /* undefined. */ + /* */ + /* vertical :: The font's vertical header (`vhea' table). */ + /* This field also contains the associated */ + /* vertical metrics table (`vmtx'), if found. */ + /* IMPORTANT: The contents of this field is */ + /* undefined if the `verticalInfo' field is */ + /* unset. */ + /* */ + /* num_names :: The number of name records within this */ + /* TrueType font. */ + /* */ + /* name_table :: The table of name records (`name'). */ + /* */ + /* os2 :: The font's OS/2 table (`OS/2'). */ + /* */ + /* postscript :: The font's PostScript table (`post' */ + /* table). The PostScript glyph names are */ + /* not loaded by the driver on face opening. */ + /* See the `ttpost' module for more details. */ + /* */ + /* cmap_table :: Address of the face's `cmap' SFNT table */ + /* in memory (it's an extracted frame). */ + /* */ + /* cmap_size :: The size in bytes of the `cmap_table' */ + /* described above. */ + /* */ + /* goto_table :: A function called by each TrueType table */ + /* loader to position a stream's cursor to */ + /* the start of a given table according to */ + /* its tag. It defaults to TT_Goto_Face but */ + /* can be different for strange formats (e.g. */ + /* Type 42). */ + /* */ + /* access_glyph_frame :: A function used to access the frame of a */ + /* given glyph within the face's font file. */ + /* */ + /* forget_glyph_frame :: A function used to forget the frame of a */ + /* given glyph when all data has been loaded. */ + /* */ + /* read_glyph_header :: A function used to read a glyph header. */ + /* It must be called between an `access' and */ + /* `forget'. */ + /* */ + /* read_simple_glyph :: A function used to read a simple glyph. */ + /* It must be called after the header was */ + /* read, and before the `forget'. */ + /* */ + /* read_composite_glyph :: A function used to read a composite glyph. */ + /* It must be called after the header was */ + /* read, and before the `forget'. */ + /* */ + /* sfnt :: A pointer to the SFNT service. */ + /* */ + /* psnames :: A pointer to the PostScript names service. */ + /* */ + /* hdmx :: The face's horizontal device metrics */ + /* (`hdmx' table). This table is optional in */ + /* TrueType/OpenType fonts. */ + /* */ + /* gasp :: The grid-fitting and scaling properties */ + /* table (`gasp'). This table is optional in */ + /* TrueType/OpenType fonts. */ + /* */ + /* pclt :: The `pclt' SFNT table. */ + /* */ + /* num_sbit_strikes :: The number of sbit strikes, i.e., bitmap */ + /* sizes, embedded in this font. */ + /* */ + /* sbit_strikes :: An array of sbit strikes embedded in this */ + /* font. This table is optional in a */ + /* TrueType/OpenType font. */ + /* */ + /* num_sbit_scales :: The number of sbit scales for this font. */ + /* */ + /* sbit_scales :: Array of sbit scales embedded in this */ + /* font. This table is optional in a */ + /* TrueType/OpenType font. */ + /* */ + /* postscript_names :: A table used to store the Postscript names */ + /* of the glyphs for this font. See the */ + /* file `ttconfig.h' for comments on the */ + /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES option. */ + /* */ + /* num_locations :: The number of glyph locations in this */ + /* TrueType file. This should be */ + /* identical to the number of glyphs. */ + /* Ignored for Type 2 fonts. */ + /* */ + /* glyph_locations :: An array of longs. These are offsets to */ + /* glyph data within the `glyf' table. */ + /* Ignored for Type 2 font faces. */ + /* */ + /* glyf_len :: The length of the `glyf' table. Needed */ + /* for malformed `loca' tables. */ + /* */ + /* font_program_size :: Size in bytecodes of the face's font */ + /* program. 0 if none defined. Ignored for */ + /* Type 2 fonts. */ + /* */ + /* font_program :: The face's font program (bytecode stream) */ + /* executed at load time, also used during */ + /* glyph rendering. Comes from the `fpgm' */ + /* table. Ignored for Type 2 font fonts. */ + /* */ + /* cvt_program_size :: The size in bytecodes of the face's cvt */ + /* program. Ignored for Type 2 fonts. */ + /* */ + /* cvt_program :: The face's cvt program (bytecode stream) */ + /* executed each time an instance/size is */ + /* changed/reset. Comes from the `prep' */ + /* table. Ignored for Type 2 fonts. */ + /* */ + /* cvt_size :: Size of the control value table (in */ + /* entries). Ignored for Type 2 fonts. */ + /* */ + /* cvt :: The face's original control value table. */ + /* Coordinates are expressed in unscaled font */ + /* units. Comes from the `cvt ' table. */ + /* Ignored for Type 2 fonts. */ + /* */ + /* num_kern_pairs :: The number of kerning pairs present in the */ + /* font file. The engine only loads the */ + /* first horizontal format 0 kern table it */ + /* finds in the font file. Ignored for */ + /* Type 2 fonts. */ + /* */ + /* kern_table_index :: The index of the kerning table in the font */ + /* kerning directory. Ignored for Type 2 */ + /* fonts. */ + /* */ + /* interpreter :: A pointer to the TrueType bytecode */ + /* interpreters field is also used to hook */ + /* the debugger in `ttdebug'. */ + /* */ + /* unpatented_hinting :: If true, use only unpatented methods in */ + /* the bytecode interpreter. */ + /* */ + /* doblend :: A boolean which is set if the font should */ + /* be blended (this is for GX var). */ + /* */ + /* blend :: Contains the data needed to control GX */ + /* variation tables (rather like Multiple */ + /* Master data). */ + /* */ + /* extra :: Reserved for third-party font drivers. */ + /* */ + /* postscript_name :: The PS name of the font. Used by the */ + /* postscript name service. */ + /* */ + typedef struct TT_FaceRec_ + { + FT_FaceRec root; + + TTC_HeaderRec ttc_header; + + FT_ULong format_tag; + FT_UShort num_tables; + TT_Table dir_tables; + + TT_Header header; /* TrueType header table */ + TT_HoriHeader horizontal; /* TrueType horizontal header */ + + TT_MaxProfile max_profile; +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_ULong max_components; /* stubbed to 0 */ +#endif + + FT_Bool vertical_info; + TT_VertHeader vertical; /* TT Vertical header, if present */ + + FT_UShort num_names; /* number of name records */ + TT_NameTableRec name_table; /* name table */ + + TT_OS2 os2; /* TrueType OS/2 table */ + TT_Postscript postscript; /* TrueType Postscript table */ + + FT_Byte* cmap_table; /* extracted `cmap' table */ + FT_ULong cmap_size; + + TT_Loader_GotoTableFunc goto_table; + + TT_Loader_StartGlyphFunc access_glyph_frame; + TT_Loader_EndGlyphFunc forget_glyph_frame; + TT_Loader_ReadGlyphFunc read_glyph_header; + TT_Loader_ReadGlyphFunc read_simple_glyph; + TT_Loader_ReadGlyphFunc read_composite_glyph; + + /* a typeless pointer to the SFNT_Interface table used to load */ + /* the basic TrueType tables in the face object */ + void* sfnt; + + /* a typeless pointer to the FT_Service_PsCMapsRec table used to */ + /* handle glyph names <-> unicode & Mac values */ + void* psnames; + + + /***********************************************************************/ + /* */ + /* Optional TrueType/OpenType tables */ + /* */ + /***********************************************************************/ + + /* horizontal device metrics */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + TT_HdmxRec hdmx; +#endif + + /* grid-fitting and scaling table */ + TT_GaspRec gasp; /* the `gasp' table */ + + /* PCL 5 table */ + TT_PCLT pclt; + + /* embedded bitmaps support */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_ULong num_sbit_strikes; + TT_SBit_Strike sbit_strikes; +#endif + + FT_ULong num_sbit_scales; + TT_SBit_Scale sbit_scales; + + /* postscript names table */ + TT_Post_NamesRec postscript_names; + + + /***********************************************************************/ + /* */ + /* TrueType-specific fields (ignored by the OTF-Type2 driver) */ + /* */ + /***********************************************************************/ + + /* the glyph locations */ +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + FT_UShort num_locations_stub; + FT_Long* glyph_locations_stub; +#endif + + /* the font program, if any */ + FT_ULong font_program_size; + FT_Byte* font_program; + + /* the cvt program, if any */ + FT_ULong cvt_program_size; + FT_Byte* cvt_program; + + /* the original, unscaled, control value table */ + FT_ULong cvt_size; + FT_Short* cvt; + +#ifdef FT_CONFIG_OPTION_OLD_INTERNALS + /* the format 0 kerning table, if any */ + FT_Int num_kern_pairs; + FT_Int kern_table_index; + TT_Kern0_Pair kern_pairs; +#endif + + /* A pointer to the bytecode interpreter to use. This is also */ + /* used to hook the debugger for the `ttdebug' utility. */ + TT_Interpreter interpreter; + +#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING + /* Use unpatented hinting only. */ + FT_Bool unpatented_hinting; +#endif + + /***********************************************************************/ + /* */ + /* Other tables or fields. This is used by derivative formats like */ + /* OpenType. */ + /* */ + /***********************************************************************/ + + FT_Generic extra; + + const char* postscript_name; + + /* since version 2.1.8, but was originally placed after */ + /* `glyph_locations_stub' */ + FT_ULong glyf_len; + + /* since version 2.1.8, but was originally placed before `extra' */ +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Bool doblend; + GX_Blend blend; +#endif + + /* since version 2.2 */ + + FT_Byte* horz_metrics; + FT_ULong horz_metrics_size; + + FT_Byte* vert_metrics; + FT_ULong vert_metrics_size; + + FT_UInt num_locations; + FT_Byte* glyph_locations; + + FT_Byte* hdmx_table; + FT_ULong hdmx_table_size; + FT_UInt hdmx_record_count; + FT_ULong hdmx_record_size; + FT_Byte* hdmx_record_sizes; + + FT_Byte* sbit_table; + FT_ULong sbit_table_size; + FT_UInt sbit_num_strikes; + + FT_Byte* kern_table; + FT_ULong kern_table_size; + FT_UInt num_kern_tables; + FT_UInt32 kern_avail_bits; + FT_UInt32 kern_order_bits; + +#ifdef TT_CONFIG_OPTION_BDF + TT_BDFRec bdf; +#endif /* TT_CONFIG_OPTION_BDF */ + + /* since 2.3.0 */ + FT_ULong horz_metrics_offset; + FT_ULong vert_metrics_offset; + + } TT_FaceRec; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_GlyphZoneRec */ + /* */ + /* <Description> */ + /* A glyph zone is used to load, scale and hint glyph outline */ + /* coordinates. */ + /* */ + /* <Fields> */ + /* memory :: A handle to the memory manager. */ + /* */ + /* max_points :: The maximal size in points of the zone. */ + /* */ + /* max_contours :: Max size in links contours of the zone. */ + /* */ + /* n_points :: The current number of points in the zone. */ + /* */ + /* n_contours :: The current number of contours in the zone. */ + /* */ + /* org :: The original glyph coordinates (font */ + /* units/scaled). */ + /* */ + /* cur :: The current glyph coordinates (scaled/hinted). */ + /* */ + /* tags :: The point control tags. */ + /* */ + /* contours :: The contours end points. */ + /* */ + /* first_point :: Offset of the current subglyph's first point. */ + /* */ + typedef struct TT_GlyphZoneRec_ + { + FT_Memory memory; + FT_UShort max_points; + FT_UShort max_contours; + FT_UShort n_points; /* number of points in zone */ + FT_Short n_contours; /* number of contours */ + + FT_Vector* org; /* original point coordinates */ + FT_Vector* cur; /* current point coordinates */ + FT_Vector* orus; /* original (unscaled) point coordinates */ + + FT_Byte* tags; /* current touch flags */ + FT_UShort* contours; /* contour end points */ + + FT_UShort first_point; /* offset of first (#0) point */ + + } TT_GlyphZoneRec, *TT_GlyphZone; + + + /* handle to execution context */ + typedef struct TT_ExecContextRec_* TT_ExecContext; + + /* glyph loader structure */ + typedef struct TT_LoaderRec_ + { + FT_Face face; + FT_Size size; + FT_GlyphSlot glyph; + FT_GlyphLoader gloader; + + FT_ULong load_flags; + FT_UInt glyph_index; + + FT_Stream stream; + FT_Int byte_len; + + FT_Short n_contours; + FT_BBox bbox; + FT_Int left_bearing; + FT_Int advance; + FT_Int linear; + FT_Bool linear_def; + FT_Bool preserve_pps; + FT_Vector pp1; + FT_Vector pp2; + + FT_ULong glyf_offset; + + /* the zone where we load our glyphs */ + TT_GlyphZoneRec base; + TT_GlyphZoneRec zone; + + TT_ExecContext exec; + FT_Byte* instructions; + FT_ULong ins_pos; + + /* for possible extensibility in other formats */ + void* other; + + /* since version 2.1.8 */ + FT_Int top_bearing; + FT_Int vadvance; + FT_Vector pp3; + FT_Vector pp4; + + /* since version 2.2.1 */ + FT_Byte* cursor; + FT_Byte* limit; + + } TT_LoaderRec; + + +FT_END_HEADER + +#endif /* __TTTYPES_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/t1tables.h b/libIGraph/include/freetype/t1tables.h new file mode 100644 index 0000000..250629d --- /dev/null +++ b/libIGraph/include/freetype/t1tables.h @@ -0,0 +1,450 @@ +/***************************************************************************/ +/* */ +/* t1tables.h */ +/* */ +/* Basic Type 1/Type 2 tables definitions and interface (specification */ +/* only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __T1TABLES_H__ +#define __T1TABLES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* <Section> */ + /* type1_tables */ + /* */ + /* <Title> */ + /* Type 1 Tables */ + /* */ + /* <Abstract> */ + /* Type 1 (PostScript) specific font tables. */ + /* */ + /* <Description> */ + /* This section contains the definition of Type 1-specific tables, */ + /* including structures related to other PostScript font formats. */ + /* */ + /*************************************************************************/ + + + /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */ + /* structures in order to support Multiple Master fonts. */ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_FontInfoRec */ + /* */ + /* <Description> */ + /* A structure used to model a Type1/Type2 FontInfo dictionary. Note */ + /* that for Multiple Master fonts, each instance has its own */ + /* FontInfo dictionary. */ + /* */ + typedef struct PS_FontInfoRec + { + FT_String* version; + FT_String* notice; + FT_String* full_name; + FT_String* family_name; + FT_String* weight; + FT_Long italic_angle; + FT_Bool is_fixed_pitch; + FT_Short underline_position; + FT_UShort underline_thickness; + + } PS_FontInfoRec, *PS_FontInfo; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* T1_FontInfo */ + /* */ + /* <Description> */ + /* This type is equivalent to @PS_FontInfoRec. It is deprecated but */ + /* kept to maintain source compatibility between various versions of */ + /* FreeType. */ + /* */ + typedef PS_FontInfoRec T1_FontInfo; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* PS_PrivateRec */ + /* */ + /* <Description> */ + /* A structure used to model a Type1/Type2 private dictionary. Note */ + /* that for Multiple Master fonts, each instance has its own Private */ + /* dictionary. */ + /* */ + typedef struct PS_PrivateRec_ + { + FT_Int unique_id; + FT_Int lenIV; + + FT_Byte num_blue_values; + FT_Byte num_other_blues; + FT_Byte num_family_blues; + FT_Byte num_family_other_blues; + + FT_Short blue_values[14]; + FT_Short other_blues[10]; + + FT_Short family_blues [14]; + FT_Short family_other_blues[10]; + + FT_Fixed blue_scale; + FT_Int blue_shift; + FT_Int blue_fuzz; + + FT_UShort standard_width[1]; + FT_UShort standard_height[1]; + + FT_Byte num_snap_widths; + FT_Byte num_snap_heights; + FT_Bool force_bold; + FT_Bool round_stem_up; + + FT_Short snap_widths [13]; /* including std width */ + FT_Short snap_heights[13]; /* including std height */ + + FT_Fixed expansion_factor; + + FT_Long language_group; + FT_Long password; + + FT_Short min_feature[2]; + + } PS_PrivateRec, *PS_Private; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* T1_Private */ + /* */ + /* <Description> */ + /* This type is equivalent to @PS_PrivateRec. It is deprecated but */ + /* kept to maintain source compatibility between various versions of */ + /* FreeType. */ + /* */ + typedef PS_PrivateRec T1_Private; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* T1_Blend_Flags */ + /* */ + /* <Description> */ + /* A set of flags used to indicate which fields are present in a */ + /* given blend dictionary (font info or private). Used to support */ + /* Multiple Masters fonts. */ + /* */ + typedef enum + { + /*# required fields in a FontInfo blend dictionary */ + T1_BLEND_UNDERLINE_POSITION = 0, + T1_BLEND_UNDERLINE_THICKNESS, + T1_BLEND_ITALIC_ANGLE, + + /*# required fields in a Private blend dictionary */ + T1_BLEND_BLUE_VALUES, + T1_BLEND_OTHER_BLUES, + T1_BLEND_STANDARD_WIDTH, + T1_BLEND_STANDARD_HEIGHT, + T1_BLEND_STEM_SNAP_WIDTHS, + T1_BLEND_STEM_SNAP_HEIGHTS, + T1_BLEND_BLUE_SCALE, + T1_BLEND_BLUE_SHIFT, + T1_BLEND_FAMILY_BLUES, + T1_BLEND_FAMILY_OTHER_BLUES, + T1_BLEND_FORCE_BOLD, + + /*# never remove */ + T1_BLEND_MAX + + } T1_Blend_Flags; + + /* */ + + + /*# backwards compatible definitions */ +#define t1_blend_underline_position T1_BLEND_UNDERLINE_POSITION +#define t1_blend_underline_thickness T1_BLEND_UNDERLINE_THICKNESS +#define t1_blend_italic_angle T1_BLEND_ITALIC_ANGLE +#define t1_blend_blue_values T1_BLEND_BLUE_VALUES +#define t1_blend_other_blues T1_BLEND_OTHER_BLUES +#define t1_blend_standard_widths T1_BLEND_STANDARD_WIDTH +#define t1_blend_standard_height T1_BLEND_STANDARD_HEIGHT +#define t1_blend_stem_snap_widths T1_BLEND_STEM_SNAP_WIDTHS +#define t1_blend_stem_snap_heights T1_BLEND_STEM_SNAP_HEIGHTS +#define t1_blend_blue_scale T1_BLEND_BLUE_SCALE +#define t1_blend_blue_shift T1_BLEND_BLUE_SHIFT +#define t1_blend_family_blues T1_BLEND_FAMILY_BLUES +#define t1_blend_family_other_blues T1_BLEND_FAMILY_OTHER_BLUES +#define t1_blend_force_bold T1_BLEND_FORCE_BOLD +#define t1_blend_max T1_BLEND_MAX + + + /* maximum number of Multiple Masters designs, as defined in the spec */ +#define T1_MAX_MM_DESIGNS 16 + + /* maximum number of Multiple Masters axes, as defined in the spec */ +#define T1_MAX_MM_AXIS 4 + + /* maximum number of elements in a design map */ +#define T1_MAX_MM_MAP_POINTS 20 + + + /* this structure is used to store the BlendDesignMap entry for an axis */ + typedef struct PS_DesignMap_ + { + FT_Byte num_points; + FT_Long* design_points; + FT_Fixed* blend_points; + + } PS_DesignMapRec, *PS_DesignMap; + + /* backwards-compatible definition */ + typedef PS_DesignMapRec T1_DesignMap; + + + typedef struct PS_BlendRec_ + { + FT_UInt num_designs; + FT_UInt num_axis; + + FT_String* axis_names[T1_MAX_MM_AXIS]; + FT_Fixed* design_pos[T1_MAX_MM_DESIGNS]; + PS_DesignMapRec design_map[T1_MAX_MM_AXIS]; + + FT_Fixed* weight_vector; + FT_Fixed* default_weight_vector; + + PS_FontInfo font_infos[T1_MAX_MM_DESIGNS + 1]; + PS_Private privates [T1_MAX_MM_DESIGNS + 1]; + + FT_ULong blend_bitflags; + + FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1]; + + /* since 2.3.0 */ + + /* undocumented, optional: the default design instance; */ + /* corresponds to default_weight_vector -- */ + /* num_default_design_vector == 0 means it is not present */ + /* in the font and associated metrics files */ + FT_UInt default_design_vector[T1_MAX_MM_DESIGNS]; + FT_UInt num_default_design_vector; + + } PS_BlendRec, *PS_Blend; + + + /* backwards-compatible definition */ + typedef PS_BlendRec T1_Blend; + + + typedef struct CID_FaceDictRec_ + { + PS_PrivateRec private_dict; + + FT_UInt len_buildchar; + FT_Fixed forcebold_threshold; + FT_Pos stroke_width; + FT_Fixed expansion_factor; + + FT_Byte paint_type; + FT_Byte font_type; + FT_Matrix font_matrix; + FT_Vector font_offset; + + FT_UInt num_subrs; + FT_ULong subrmap_offset; + FT_Int sd_bytes; + + } CID_FaceDictRec, *CID_FaceDict; + + + /* backwards-compatible definition */ + typedef CID_FaceDictRec CID_FontDict; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_FaceInfoRec */ + /* */ + /* <Description> */ + /* A structure used to represent CID Face information. */ + /* */ + typedef struct CID_FaceInfoRec_ + { + FT_String* cid_font_name; + FT_Fixed cid_version; + FT_Int cid_font_type; + + FT_String* registry; + FT_String* ordering; + FT_Int supplement; + + PS_FontInfoRec font_info; + FT_BBox font_bbox; + FT_ULong uid_base; + + FT_Int num_xuid; + FT_ULong xuid[16]; + + FT_ULong cidmap_offset; + FT_Int fd_bytes; + FT_Int gd_bytes; + FT_ULong cid_count; + + FT_Int num_dicts; + CID_FaceDict font_dicts; + + FT_ULong data_offset; + + } CID_FaceInfoRec, *CID_FaceInfo; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* CID_Info */ + /* */ + /* <Description> */ + /* This type is equivalent to @CID_FaceInfoRec. It is deprecated but */ + /* kept to maintain source compatibility between various versions of */ + /* FreeType. */ + /* */ + typedef CID_FaceInfoRec CID_Info; + + /* */ + + + /************************************************************************ + * + * @function: + * FT_Has_PS_Glyph_Names + * + * @description: + * Return true if a given face provides reliable Postscript glyph + * names. This is similar to using the @FT_HAS_GLYPH_NAMES macro, + * except that certain fonts (mostly TrueType) contain incorrect + * glyph name tables. + * + * When this function returns true, the caller is sure that the glyph + * names returned by @FT_Get_Glyph_Name are reliable. + * + * @input: + * face :: + * face handle + * + * @return: + * Boolean. True if glyph names are reliable. + */ + FT_EXPORT( FT_Int ) + FT_Has_PS_Glyph_Names( FT_Face face ); + + + /************************************************************************ + * + * @function: + * FT_Get_PS_Font_Info + * + * @description: + * Retrieve the @PS_FontInfoRec structure corresponding to a given + * Postscript font. + * + * @input: + * face :: + * Postscript face handle. + * + * @output: + * afont_info :: + * Output font info structure pointer. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The string pointers within the font info structure are owned by + * the face and don't need to be freed by the caller. + * + * If the font's format is not Postscript-based, this function will + * return the `FT_Err_Invalid_Argument' error code. + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Info( FT_Face face, + PS_FontInfoRec *afont_info ); + + + /************************************************************************ + * + * @function: + * FT_Get_PS_Font_Private + * + * @description: + * Retrieve the @PS_PrivateRec structure corresponding to a given + * Postscript font. + * + * @input: + * face :: + * Postscript face handle. + * + * @output: + * afont_private :: + * Output private dictionary structure pointer. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * The string pointers within the font info structure are owned by + * the face and don't need to be freed by the caller. + * + * If the font's format is not Postscript-based, this function will + * return the `FT_Err_Invalid_Argument' error code. + */ + FT_EXPORT( FT_Error ) + FT_Get_PS_Font_Private( FT_Face face, + PS_PrivateRec *afont_private ); + + /* */ + + + +FT_END_HEADER + +#endif /* __T1TABLES_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ttnameid.h b/libIGraph/include/freetype/ttnameid.h new file mode 100644 index 0000000..b9acbda --- /dev/null +++ b/libIGraph/include/freetype/ttnameid.h @@ -0,0 +1,1132 @@ +/***************************************************************************/ +/* */ +/* ttnameid.h */ +/* */ +/* TrueType name ID definitions (specification only). */ +/* */ +/* Copyright 1996-2002, 2003, 2004, 2006, 2007 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTNAMEID_H__ +#define __TTNAMEID_H__ + + +#include <ft2build.h> + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* Possible values for the `platform' identifier code in the name */ + /* records of the TTF `name' table. */ + /* */ + /*************************************************************************/ + + + /*********************************************************************** + * + * @enum: + * TT_PLATFORM_XXX + * + * @description: + * A list of valid values for the `platform_id' identifier code in + * @FT_CharMapRec and @FT_SfntName structures. + * + * @values: + * TT_PLATFORM_APPLE_UNICODE :: + * Used by Apple to indicate a Unicode character map and/or name entry. + * See @TT_APPLE_ID_XXX for corresponding `encoding_id' values. Note + * that name entries in this format are coded as big-endian UCS-2 + * character codes _only_. + * + * TT_PLATFORM_MACINTOSH :: + * Used by Apple to indicate a MacOS-specific charmap and/or name entry. + * See @TT_MAC_ID_XXX for corresponding `encoding_id' values. Note that + * most TrueType fonts contain an Apple roman charmap to be usable on + * MacOS systems (even if they contain a Microsoft charmap as well). + * + * TT_PLATFORM_ISO :: + * This value was used to specify Unicode charmaps. It is however + * now deprecated. See @TT_ISO_ID_XXX for a list of corresponding + * `encoding_id' values. + * + * TT_PLATFORM_MICROSOFT :: + * Used by Microsoft to indicate Windows-specific charmaps. See + * @TT_MS_ID_XXX for a list of corresponding `encoding_id' values. + * Note that most fonts contain a Unicode charmap using + * (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS). + * + * TT_PLATFORM_CUSTOM :: + * Used to indicate application-specific charmaps. + * + * TT_PLATFORM_ADOBE :: + * This value isn't part of any font format specification, but is used + * by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec + * structure. See @TT_ADOBE_ID_XXX. + */ + +#define TT_PLATFORM_APPLE_UNICODE 0 +#define TT_PLATFORM_MACINTOSH 1 +#define TT_PLATFORM_ISO 2 /* deprecated */ +#define TT_PLATFORM_MICROSOFT 3 +#define TT_PLATFORM_CUSTOM 4 +#define TT_PLATFORM_ADOBE 7 /* artificial */ + + + /*********************************************************************** + * + * @enum: + * TT_APPLE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_APPLE_UNICODE charmaps and name entries. + * + * @values: + * TT_APPLE_ID_DEFAULT :: + * Unicode version 1.0. + * + * TT_APPLE_ID_UNICODE_1_1 :: + * Unicode 1.1; specifies Hangul characters starting at U+34xx. + * + * TT_APPLE_ID_ISO_10646 :: + * Deprecated (identical to preceding). + * + * TT_APPLE_ID_UNICODE_2_0 :: + * Unicode 2.0 and beyond (UTF-16 BMP only). + * + * TT_APPLE_ID_UNICODE_32 :: + * Unicode 3.1 and beyond, using UTF-32. + */ + +#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */ +#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */ +#define TT_APPLE_ID_ISO_10646 2 /* deprecated */ +#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */ +#define TT_APPLE_ID_UNICODE_32 4 /* 2.0 or later, full repertoire */ + + + /*********************************************************************** + * + * @enum: + * TT_MAC_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_MACINTOSH charmaps and name entries. + * + * @values: + * TT_MAC_ID_ROMAN :: + * TT_MAC_ID_JAPANESE :: + * TT_MAC_ID_TRADITIONAL_CHINESE :: + * TT_MAC_ID_KOREAN :: + * TT_MAC_ID_ARABIC :: + * TT_MAC_ID_HEBREW :: + * TT_MAC_ID_GREEK :: + * TT_MAC_ID_RUSSIAN :: + * TT_MAC_ID_RSYMBOL :: + * TT_MAC_ID_DEVANAGARI :: + * TT_MAC_ID_GURMUKHI :: + * TT_MAC_ID_GUJARATI :: + * TT_MAC_ID_ORIYA :: + * TT_MAC_ID_BENGALI :: + * TT_MAC_ID_TAMIL :: + * TT_MAC_ID_TELUGU :: + * TT_MAC_ID_KANNADA :: + * TT_MAC_ID_MALAYALAM :: + * TT_MAC_ID_SINHALESE :: + * TT_MAC_ID_BURMESE :: + * TT_MAC_ID_KHMER :: + * TT_MAC_ID_THAI :: + * TT_MAC_ID_LAOTIAN :: + * TT_MAC_ID_GEORGIAN :: + * TT_MAC_ID_ARMENIAN :: + * TT_MAC_ID_MALDIVIAN :: + * TT_MAC_ID_SIMPLIFIED_CHINESE :: + * TT_MAC_ID_TIBETAN :: + * TT_MAC_ID_MONGOLIAN :: + * TT_MAC_ID_GEEZ :: + * TT_MAC_ID_SLAVIC :: + * TT_MAC_ID_VIETNAMESE :: + * TT_MAC_ID_SINDHI :: + * TT_MAC_ID_UNINTERP :: + */ + +#define TT_MAC_ID_ROMAN 0 +#define TT_MAC_ID_JAPANESE 1 +#define TT_MAC_ID_TRADITIONAL_CHINESE 2 +#define TT_MAC_ID_KOREAN 3 +#define TT_MAC_ID_ARABIC 4 +#define TT_MAC_ID_HEBREW 5 +#define TT_MAC_ID_GREEK 6 +#define TT_MAC_ID_RUSSIAN 7 +#define TT_MAC_ID_RSYMBOL 8 +#define TT_MAC_ID_DEVANAGARI 9 +#define TT_MAC_ID_GURMUKHI 10 +#define TT_MAC_ID_GUJARATI 11 +#define TT_MAC_ID_ORIYA 12 +#define TT_MAC_ID_BENGALI 13 +#define TT_MAC_ID_TAMIL 14 +#define TT_MAC_ID_TELUGU 15 +#define TT_MAC_ID_KANNADA 16 +#define TT_MAC_ID_MALAYALAM 17 +#define TT_MAC_ID_SINHALESE 18 +#define TT_MAC_ID_BURMESE 19 +#define TT_MAC_ID_KHMER 20 +#define TT_MAC_ID_THAI 21 +#define TT_MAC_ID_LAOTIAN 22 +#define TT_MAC_ID_GEORGIAN 23 +#define TT_MAC_ID_ARMENIAN 24 +#define TT_MAC_ID_MALDIVIAN 25 +#define TT_MAC_ID_SIMPLIFIED_CHINESE 25 +#define TT_MAC_ID_TIBETAN 26 +#define TT_MAC_ID_MONGOLIAN 27 +#define TT_MAC_ID_GEEZ 28 +#define TT_MAC_ID_SLAVIC 29 +#define TT_MAC_ID_VIETNAMESE 30 +#define TT_MAC_ID_SINDHI 31 +#define TT_MAC_ID_UNINTERP 32 + + + /*********************************************************************** + * + * @enum: + * TT_ISO_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_ISO charmaps and name entries. + * + * Their use is now deprecated. + * + * @values: + * TT_ISO_ID_7BIT_ASCII :: + * ASCII. + * TT_ISO_ID_10646 :: + * ISO/10646. + * TT_ISO_ID_8859_1 :: + * Also known as Latin-1. + */ + +#define TT_ISO_ID_7BIT_ASCII 0 +#define TT_ISO_ID_10646 1 +#define TT_ISO_ID_8859_1 2 + + + /*********************************************************************** + * + * @enum: + * TT_MS_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_MICROSOFT charmaps and name entries. + * + * @values: + * TT_MS_ID_SYMBOL_CS :: + * Corresponds to Microsoft symbol encoding. See + * @FT_ENCODING_MS_SYMBOL. + * + * TT_MS_ID_UNICODE_CS :: + * Corresponds to a Microsoft WGL4 charmap, matching Unicode. See + * @FT_ENCODING_UNICODE. + * + * TT_MS_ID_SJIS :: + * Corresponds to SJIS Japanese encoding. See @FT_ENCODING_SJIS. + * + * TT_MS_ID_GB2312 :: + * Corresponds to Simplified Chinese as used in Mainland China. See + * @FT_ENCODING_GB2312. + * + * TT_MS_ID_BIG_5 :: + * Corresponds to Traditional Chinese as used in Taiwan and Hong Kong. + * See @FT_ENCODING_BIG5. + * + * TT_MS_ID_WANSUNG :: + * Corresponds to Korean Wansung encoding. See @FT_ENCODING_WANSUNG. + * + * TT_MS_ID_JOHAB :: + * Corresponds to Johab encoding. See @FT_ENCODING_JOHAB. + * + * TT_MS_ID_UCS_4 :: + * Corresponds to UCS-4 or UTF-32 charmaps. This has been added to + * the OpenType specification version 1.4 (mid-2001.) + */ + +#define TT_MS_ID_SYMBOL_CS 0 +#define TT_MS_ID_UNICODE_CS 1 +#define TT_MS_ID_SJIS 2 +#define TT_MS_ID_GB2312 3 +#define TT_MS_ID_BIG_5 4 +#define TT_MS_ID_WANSUNG 5 +#define TT_MS_ID_JOHAB 6 +#define TT_MS_ID_UCS_4 10 + + + /*********************************************************************** + * + * @enum: + * TT_ADOBE_ID_XXX + * + * @description: + * A list of valid values for the `encoding_id' for + * @TT_PLATFORM_ADOBE charmaps. This is a FreeType-specific extension! + * + * @values: + * TT_ADOBE_ID_STANDARD :: + * Adobe standard encoding. + * TT_ADOBE_ID_EXPERT :: + * Adobe expert encoding. + * TT_ADOBE_ID_CUSTOM :: + * Adobe custom encoding. + */ + +#define TT_ADOBE_ID_STANDARD 0 +#define TT_ADOBE_ID_EXPERT 1 +#define TT_ADOBE_ID_CUSTOM 2 +#define TT_ADOBE_ID_LATIN_1 3 + + + /*************************************************************************/ + /* */ + /* Possible values of the language identifier field in the name records */ + /* of the TTF `name' table if the `platform' identifier code is */ + /* TT_PLATFORM_MACINTOSH. */ + /* */ + /* The canonical source for the Apple assigned Language ID's is at */ + /* */ + /* http://fonts.apple.com/TTRefMan/RM06/Chap6name.html */ + /* */ +#define TT_MAC_LANGID_ENGLISH 0 +#define TT_MAC_LANGID_FRENCH 1 +#define TT_MAC_LANGID_GERMAN 2 +#define TT_MAC_LANGID_ITALIAN 3 +#define TT_MAC_LANGID_DUTCH 4 +#define TT_MAC_LANGID_SWEDISH 5 +#define TT_MAC_LANGID_SPANISH 6 +#define TT_MAC_LANGID_DANISH 7 +#define TT_MAC_LANGID_PORTUGUESE 8 +#define TT_MAC_LANGID_NORWEGIAN 9 +#define TT_MAC_LANGID_HEBREW 10 +#define TT_MAC_LANGID_JAPANESE 11 +#define TT_MAC_LANGID_ARABIC 12 +#define TT_MAC_LANGID_FINNISH 13 +#define TT_MAC_LANGID_GREEK 14 +#define TT_MAC_LANGID_ICELANDIC 15 +#define TT_MAC_LANGID_MALTESE 16 +#define TT_MAC_LANGID_TURKISH 17 +#define TT_MAC_LANGID_CROATIAN 18 +#define TT_MAC_LANGID_CHINESE_TRADITIONAL 19 +#define TT_MAC_LANGID_URDU 20 +#define TT_MAC_LANGID_HINDI 21 +#define TT_MAC_LANGID_THAI 22 +#define TT_MAC_LANGID_KOREAN 23 +#define TT_MAC_LANGID_LITHUANIAN 24 +#define TT_MAC_LANGID_POLISH 25 +#define TT_MAC_LANGID_HUNGARIAN 26 +#define TT_MAC_LANGID_ESTONIAN 27 +#define TT_MAC_LANGID_LETTISH 28 +#define TT_MAC_LANGID_SAAMISK 29 +#define TT_MAC_LANGID_FAEROESE 30 +#define TT_MAC_LANGID_FARSI 31 +#define TT_MAC_LANGID_RUSSIAN 32 +#define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33 +#define TT_MAC_LANGID_FLEMISH 34 +#define TT_MAC_LANGID_IRISH 35 +#define TT_MAC_LANGID_ALBANIAN 36 +#define TT_MAC_LANGID_ROMANIAN 37 +#define TT_MAC_LANGID_CZECH 38 +#define TT_MAC_LANGID_SLOVAK 39 +#define TT_MAC_LANGID_SLOVENIAN 40 +#define TT_MAC_LANGID_YIDDISH 41 +#define TT_MAC_LANGID_SERBIAN 42 +#define TT_MAC_LANGID_MACEDONIAN 43 +#define TT_MAC_LANGID_BULGARIAN 44 +#define TT_MAC_LANGID_UKRAINIAN 45 +#define TT_MAC_LANGID_BYELORUSSIAN 46 +#define TT_MAC_LANGID_UZBEK 47 +#define TT_MAC_LANGID_KAZAKH 48 +#define TT_MAC_LANGID_AZERBAIJANI 49 +#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT 49 +#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50 +#define TT_MAC_LANGID_ARMENIAN 51 +#define TT_MAC_LANGID_GEORGIAN 52 +#define TT_MAC_LANGID_MOLDAVIAN 53 +#define TT_MAC_LANGID_KIRGHIZ 54 +#define TT_MAC_LANGID_TAJIKI 55 +#define TT_MAC_LANGID_TURKMEN 56 +#define TT_MAC_LANGID_MONGOLIAN 57 +#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT 57 +#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58 +#define TT_MAC_LANGID_PASHTO 59 +#define TT_MAC_LANGID_KURDISH 60 +#define TT_MAC_LANGID_KASHMIRI 61 +#define TT_MAC_LANGID_SINDHI 62 +#define TT_MAC_LANGID_TIBETAN 63 +#define TT_MAC_LANGID_NEPALI 64 +#define TT_MAC_LANGID_SANSKRIT 65 +#define TT_MAC_LANGID_MARATHI 66 +#define TT_MAC_LANGID_BENGALI 67 +#define TT_MAC_LANGID_ASSAMESE 68 +#define TT_MAC_LANGID_GUJARATI 69 +#define TT_MAC_LANGID_PUNJABI 70 +#define TT_MAC_LANGID_ORIYA 71 +#define TT_MAC_LANGID_MALAYALAM 72 +#define TT_MAC_LANGID_KANNADA 73 +#define TT_MAC_LANGID_TAMIL 74 +#define TT_MAC_LANGID_TELUGU 75 +#define TT_MAC_LANGID_SINHALESE 76 +#define TT_MAC_LANGID_BURMESE 77 +#define TT_MAC_LANGID_KHMER 78 +#define TT_MAC_LANGID_LAO 79 +#define TT_MAC_LANGID_VIETNAMESE 80 +#define TT_MAC_LANGID_INDONESIAN 81 +#define TT_MAC_LANGID_TAGALOG 82 +#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83 +#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84 +#define TT_MAC_LANGID_AMHARIC 85 +#define TT_MAC_LANGID_TIGRINYA 86 +#define TT_MAC_LANGID_GALLA 87 +#define TT_MAC_LANGID_SOMALI 88 +#define TT_MAC_LANGID_SWAHILI 89 +#define TT_MAC_LANGID_RUANDA 90 +#define TT_MAC_LANGID_RUNDI 91 +#define TT_MAC_LANGID_CHEWA 92 +#define TT_MAC_LANGID_MALAGASY 93 +#define TT_MAC_LANGID_ESPERANTO 94 +#define TT_MAC_LANGID_WELSH 128 +#define TT_MAC_LANGID_BASQUE 129 +#define TT_MAC_LANGID_CATALAN 130 +#define TT_MAC_LANGID_LATIN 131 +#define TT_MAC_LANGID_QUECHUA 132 +#define TT_MAC_LANGID_GUARANI 133 +#define TT_MAC_LANGID_AYMARA 134 +#define TT_MAC_LANGID_TATAR 135 +#define TT_MAC_LANGID_UIGHUR 136 +#define TT_MAC_LANGID_DZONGKHA 137 +#define TT_MAC_LANGID_JAVANESE 138 +#define TT_MAC_LANGID_SUNDANESE 139 + + +#if 0 /* these seem to be errors that have been dropped */ + +#define TT_MAC_LANGID_SCOTTISH_GAELIC 140 +#define TT_MAC_LANGID_IRISH_GAELIC 141 + +#endif + + + /* The following codes are new as of 2000-03-10 */ +#define TT_MAC_LANGID_GALICIAN 140 +#define TT_MAC_LANGID_AFRIKAANS 141 +#define TT_MAC_LANGID_BRETON 142 +#define TT_MAC_LANGID_INUKTITUT 143 +#define TT_MAC_LANGID_SCOTTISH_GAELIC 144 +#define TT_MAC_LANGID_MANX_GAELIC 145 +#define TT_MAC_LANGID_IRISH_GAELIC 146 +#define TT_MAC_LANGID_TONGAN 147 +#define TT_MAC_LANGID_GREEK_POLYTONIC 148 +#define TT_MAC_LANGID_GREELANDIC 149 +#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150 + + + /*************************************************************************/ + /* */ + /* Possible values of the language identifier field in the name records */ + /* of the TTF `name' table if the `platform' identifier code is */ + /* TT_PLATFORM_MICROSOFT. */ + /* */ + /* The canonical source for the MS assigned LCID's (seems to) be at */ + /* */ + /* http://www.microsoft.com/globaldev/reference/lcid-all.mspx */ + /* */ + /* It used to be at various places, among them */ + /* */ + /* http://www.microsoft.com/typography/OTSPEC/lcid-cp.txt */ + /* http://www.microsoft.com/globaldev/reference/loclanghome.asp */ + /* http://support.microsoft.com/support/kb/articles/Q224/8/04.ASP */ + /* http://msdn.microsoft.com/library/en-us/passport25/ */ + /* NET_Passport_VBScript_Documentation/Single_Sign_In/ */ + /* Advanced_Single_Sign_In/Localization_and_LCIDs.asp */ + /* */ + /* Hopefully, it seems now that the Globaldev site prevails... */ + /* (updated by Antoine, 2004-02-17) */ + +#define TT_MS_LANGID_ARABIC_GENERAL 0x0001 +#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401 +#define TT_MS_LANGID_ARABIC_IRAQ 0x0801 +#define TT_MS_LANGID_ARABIC_EGYPT 0x0c01 +#define TT_MS_LANGID_ARABIC_LIBYA 0x1001 +#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401 +#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801 +#define TT_MS_LANGID_ARABIC_TUNISIA 0x1c01 +#define TT_MS_LANGID_ARABIC_OMAN 0x2001 +#define TT_MS_LANGID_ARABIC_YEMEN 0x2401 +#define TT_MS_LANGID_ARABIC_SYRIA 0x2801 +#define TT_MS_LANGID_ARABIC_JORDAN 0x2c01 +#define TT_MS_LANGID_ARABIC_LEBANON 0x3001 +#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401 +#define TT_MS_LANGID_ARABIC_UAE 0x3801 +#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3c01 +#define TT_MS_LANGID_ARABIC_QATAR 0x4001 +#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402 +#define TT_MS_LANGID_CATALAN_SPAIN 0x0403 +#define TT_MS_LANGID_CHINESE_GENERAL 0x0004 +#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404 +#define TT_MS_LANGID_CHINESE_PRC 0x0804 +#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0c04 +#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004 + +#if 1 /* this looks like the correct value */ +#define TT_MS_LANGID_CHINESE_MACAU 0x1404 +#else /* but beware, Microsoft may change its mind... + the most recent Word reference has the following: */ +#define TT_MS_LANGID_CHINESE_MACAU TT_MS_LANGID_CHINESE_HONG_KONG +#endif + +#if 0 /* used only with .NET `cultures'; commented out */ +#define TT_MS_LANGID_CHINESE_TRADITIONAL 0x7C04 +#endif + +#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405 +#define TT_MS_LANGID_DANISH_DENMARK 0x0406 +#define TT_MS_LANGID_GERMAN_GERMANY 0x0407 +#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807 +#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0c07 +#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007 +#define TT_MS_LANGID_GERMAN_LIECHTENSTEI 0x1407 +#define TT_MS_LANGID_GREEK_GREECE 0x0408 + + /* don't ask what this one means... It is commented out currently. */ +#if 0 +#define TT_MS_LANGID_GREEK_GREECE2 0x2008 +#endif + +#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009 +#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409 +#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809 +#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0c09 +#define TT_MS_LANGID_ENGLISH_CANADA 0x1009 +#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409 +#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809 +#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1c09 +#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009 +#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409 +#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809 +#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2c09 +#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009 +#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409 +#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809 +#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3c09 +#define TT_MS_LANGID_ENGLISH_INDIA 0x4009 +#define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409 +#define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809 +#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040a +#define TT_MS_LANGID_SPANISH_MEXICO 0x080a +#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT 0x0c0a +#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100a +#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140a +#define TT_MS_LANGID_SPANISH_PANAMA 0x180a +#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1c0a +#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200a +#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240a +#define TT_MS_LANGID_SPANISH_PERU 0x280a +#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2c0a +#define TT_MS_LANGID_SPANISH_ECUADOR 0x300a +#define TT_MS_LANGID_SPANISH_CHILE 0x340a +#define TT_MS_LANGID_SPANISH_URUGUAY 0x380a +#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3c0a +#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400a +#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440a +#define TT_MS_LANGID_SPANISH_HONDURAS 0x480a +#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4c0a +#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500a +#define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540a + /* The following ID blatantly violate MS specs by using a */ + /* sublanguage > 0x1F. */ +#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40aU +#define TT_MS_LANGID_FINNISH_FINLAND 0x040b +#define TT_MS_LANGID_FRENCH_FRANCE 0x040c +#define TT_MS_LANGID_FRENCH_BELGIUM 0x080c +#define TT_MS_LANGID_FRENCH_CANADA 0x0c0c +#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100c +#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140c +#define TT_MS_LANGID_FRENCH_MONACO 0x180c +#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1c0c +#define TT_MS_LANGID_FRENCH_REUNION 0x200c +#define TT_MS_LANGID_FRENCH_CONGO 0x240c + /* which was formerly: */ +#define TT_MS_LANGID_FRENCH_ZAIRE TT_MS_LANGID_FRENCH_CONGO +#define TT_MS_LANGID_FRENCH_SENEGAL 0x280c +#define TT_MS_LANGID_FRENCH_CAMEROON 0x2c0c +#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300c +#define TT_MS_LANGID_FRENCH_MALI 0x340c +#define TT_MS_LANGID_FRENCH_MOROCCO 0x380c +#define TT_MS_LANGID_FRENCH_HAITI 0x3c0c + /* and another violation of the spec (see 0xE40aU) */ +#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40cU +#define TT_MS_LANGID_HEBREW_ISRAEL 0x040d +#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040e +#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040f +#define TT_MS_LANGID_ITALIAN_ITALY 0x0410 +#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810 +#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411 +#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA 0x0412 +#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812 +#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413 +#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414 +#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814 +#define TT_MS_LANGID_POLISH_POLAND 0x0415 +#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416 +#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816 +#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND 0x0417 +#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418 +#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818 +#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419 +#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819 +#define TT_MS_LANGID_CROATIAN_CROATIA 0x041a +#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081a +#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0c1a + +#if 0 /* this used to be this value, but it looks like we were wrong */ +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x101a +#else /* current sources say */ +#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA 0x101a +#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x141a + /* and XPsp2 Platform SDK added (2004-07-26) */ + /* Names are shortened to be significant within 40 chars. */ +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN 0x181a +#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x181a +#endif + +#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041b +#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041c +#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041d +#define TT_MS_LANGID_SWEDISH_FINLAND 0x081d +#define TT_MS_LANGID_THAI_THAILAND 0x041e +#define TT_MS_LANGID_TURKISH_TURKEY 0x041f +#define TT_MS_LANGID_URDU_PAKISTAN 0x0420 +#define TT_MS_LANGID_URDU_INDIA 0x0820 +#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421 +#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422 +#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423 +#define TT_MS_LANGID_SLOVENE_SLOVENIA 0x0424 +#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425 +#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426 +#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427 +#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827 +#define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428 +#define TT_MS_LANGID_FARSI_IRAN 0x0429 +#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042a +#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042b +#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042c +#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082c +#define TT_MS_LANGID_BASQUE_SPAIN 0x042d +#define TT_MS_LANGID_SORBIAN_GERMANY 0x042e +#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042f +#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430 +#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431 +#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA 0x0432 +#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433 +#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA 0x0434 +#define TT_MS_LANGID_ZULU_SOUTH_AFRICA 0x0435 +#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436 +#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437 +#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438 +#define TT_MS_LANGID_HINDI_INDIA 0x0439 +#define TT_MS_LANGID_MALTESE_MALTA 0x043a + /* Added by XPsp2 Platform SDK (2004-07-26) */ +#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY 0x043b +#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN 0x083b +#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND 0x0C3b +#define TT_MS_LANGID_SAMI_LULE_NORWAY 0x103b +#define TT_MS_LANGID_SAMI_LULE_SWEDEN 0x143b +#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY 0x183b +#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN 0x1C3b +#define TT_MS_LANGID_SAMI_SKOLT_FINLAND 0x203b +#define TT_MS_LANGID_SAMI_INARI_FINLAND 0x243b + /* ... and we also keep our old identifier... */ +#define TT_MS_LANGID_SAAMI_LAPONIA 0x043b + +#if 0 /* this seems to be a previous inversion */ +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c +#else +#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c +#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c +#endif + +#define TT_MS_LANGID_YIDDISH_GERMANY 0x043d +#define TT_MS_LANGID_MALAY_MALAYSIA 0x043e +#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083e +#define TT_MS_LANGID_KAZAK_KAZAKSTAN 0x043f +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440 + /* alias declared in Windows 2000 */ +#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \ + TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN + +#define TT_MS_LANGID_SWAHILI_KENYA 0x0441 +#define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443 +#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843 +#define TT_MS_LANGID_TATAR_TATARSTAN 0x0444 +#define TT_MS_LANGID_BENGALI_INDIA 0x0445 +#define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845 +#define TT_MS_LANGID_PUNJABI_INDIA 0x0446 +#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846 +#define TT_MS_LANGID_GUJARATI_INDIA 0x0447 +#define TT_MS_LANGID_ORIYA_INDIA 0x0448 +#define TT_MS_LANGID_TAMIL_INDIA 0x0449 +#define TT_MS_LANGID_TELUGU_INDIA 0x044a +#define TT_MS_LANGID_KANNADA_INDIA 0x044b +#define TT_MS_LANGID_MALAYALAM_INDIA 0x044c +#define TT_MS_LANGID_ASSAMESE_INDIA 0x044d +#define TT_MS_LANGID_MARATHI_INDIA 0x044e +#define TT_MS_LANGID_SANSKRIT_INDIA 0x044f +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450 +#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN 0x0850 +#define TT_MS_LANGID_TIBETAN_CHINA 0x0451 + /* Don't use the next constant! It has */ + /* (1) the wrong spelling (Dzonghka) */ + /* (2) Microsoft doesn't officially define it -- */ + /* at least it is not in the List of Local */ + /* ID Values. */ + /* (3) Dzongkha is not the same language as */ + /* Tibetan, so merging it is wrong anyway. */ + /* */ + /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW. */ +#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851 + +#if 0 + /* the following used to be defined */ +#define TT_MS_LANGID_TIBETAN_BHUTAN 0x0451 + /* ... but it was changed; */ +#else + /* So we will continue to #define it, but with the correct value */ +#define TT_MS_LANGID_TIBETAN_BHUTAN TT_MS_LANGID_DZONGHKA_BHUTAN +#endif + +#define TT_MS_LANGID_WELSH_WALES 0x0452 +#define TT_MS_LANGID_KHMER_CAMBODIA 0x0453 +#define TT_MS_LANGID_LAO_LAOS 0x0454 +#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455 +#define TT_MS_LANGID_GALICIAN_SPAIN 0x0456 +#define TT_MS_LANGID_KONKANI_INDIA 0x0457 +#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458 +#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459 +#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859 + /* Missing a LCID for Sindhi in Devanagari script */ +#define TT_MS_LANGID_SYRIAC_SYRIA 0x045a +#define TT_MS_LANGID_SINHALESE_SRI_LANKA 0x045b +#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045c +#define TT_MS_LANGID_INUKTITUT_CANADA 0x045d +#define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045e +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045f +#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN 0x085f + /* Missing a LCID for Tifinagh script */ +#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460 + /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */ + /* script is yet unclear... might be Arabic, Nagari or Sharada */ +#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860 + /* ... and aliased (by MS) for compatibility reasons. */ +#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA +#define TT_MS_LANGID_NEPALI_NEPAL 0x0461 +#define TT_MS_LANGID_NEPALI_INDIA 0x0861 +#define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462 +#define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463 +#define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464 +#define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465 + /* alias declared in Windows 2000 */ +#define TT_MS_LANGID_DIVEHI_MALDIVES TT_MS_LANGID_DHIVEHI_MALDIVES +#define TT_MS_LANGID_EDO_NIGERIA 0x0466 +#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467 +#define TT_MS_LANGID_HAUSA_NIGERIA 0x0468 +#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469 +#define TT_MS_LANGID_YORUBA_NIGERIA 0x046a +#define TT_MS_LANGID_QUECHUA_BOLIVIA 0x046b +#define TT_MS_LANGID_QUECHUA_ECUADOR 0x086b +#define TT_MS_LANGID_QUECHUA_PERU 0x0c6b +#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA 0x046c + /* Also spelled by XPsp2 Platform SDK (2004-07-26) */ +#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \ + TT_MS_LANGID_SEPEDI_SOUTH_AFRICA + /* language codes 0x046d, 0x046e and 0x046f are (still) unknown. */ +#define TT_MS_LANGID_IGBO_NIGERIA 0x0470 +#define TT_MS_LANGID_KANURI_NIGERIA 0x0471 +#define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472 +#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473 +#define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873 + /* also spelled in the `Passport SDK' list as: */ +#define TT_MS_LANGID_TIGRIGNA_ERYTREA TT_MS_LANGID_TIGRIGNA_ERYTHREA +#define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474 +#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475 +#define TT_MS_LANGID_LATIN 0x0476 +#define TT_MS_LANGID_SOMALI_SOMALIA 0x0477 + /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */ + /* not written (but OTOH the peculiar writing system is worth */ + /* studying). */ +#define TT_MS_LANGID_YI_CHINA 0x0478 +#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479 + /* language codes from 0x047a to 0x047f are (still) unknown. */ +#define TT_MS_LANGID_UIGHUR_CHINA 0x0480 +#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481 + +#if 0 /* not deemed useful for fonts */ +#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE 0x04ff +#endif + + + /*************************************************************************/ + /* */ + /* Possible values of the `name' identifier field in the name records of */ + /* the TTF `name' table. These values are platform independent. */ + /* */ +#define TT_NAME_ID_COPYRIGHT 0 +#define TT_NAME_ID_FONT_FAMILY 1 +#define TT_NAME_ID_FONT_SUBFAMILY 2 +#define TT_NAME_ID_UNIQUE_ID 3 +#define TT_NAME_ID_FULL_NAME 4 +#define TT_NAME_ID_VERSION_STRING 5 +#define TT_NAME_ID_PS_NAME 6 +#define TT_NAME_ID_TRADEMARK 7 + + /* the following values are from the OpenType spec */ +#define TT_NAME_ID_MANUFACTURER 8 +#define TT_NAME_ID_DESIGNER 9 +#define TT_NAME_ID_DESCRIPTION 10 +#define TT_NAME_ID_VENDOR_URL 11 +#define TT_NAME_ID_DESIGNER_URL 12 +#define TT_NAME_ID_LICENSE 13 +#define TT_NAME_ID_LICENSE_URL 14 + /* number 15 is reserved */ +#define TT_NAME_ID_PREFERRED_FAMILY 16 +#define TT_NAME_ID_PREFERRED_SUBFAMILY 17 +#define TT_NAME_ID_MAC_FULL_NAME 18 + + /* The following code is new as of 2000-01-21 */ +#define TT_NAME_ID_SAMPLE_TEXT 19 + + /* This is new in OpenType 1.3 */ +#define TT_NAME_ID_CID_FINDFONT_NAME 20 + + + /*************************************************************************/ + /* */ + /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table. */ + /* */ + /* Updated 02-Jul-2000. */ + /* */ + + /* General Scripts Area */ + + /* Bit 0 Basic Latin */ +#define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */ + /* Bit 1 C1 Controls and Latin-1 Supplement */ +#define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */ + /* Bit 2 Latin Extended-A */ +#define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */ + /* Bit 3 Latin Extended-B */ +#define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */ + /* Bit 4 IPA Extensions */ +#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */ + /* Bit 5 Spacing Modifier Letters */ +#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */ + /* Bit 6 Combining Diacritical Marks */ +#define TT_UCR_COMBINING_DIACRITICS (1L << 6) /* U+0300-U+036F */ + /* Bit 7 Greek and Coptic */ +#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */ + /* Bit 8 is reserved (was: Greek Symbols and Coptic) */ + /* Bit 9 Cyrillic + */ + /* Cyrillic Supplementary */ +#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */ + /* U+0500-U+052F */ + /* Bit 10 Armenian */ +#define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */ + /* Bit 11 Hebrew */ +#define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */ + /* Bit 12 is reserved (was: Hebrew Extended) */ + /* Bit 13 Arabic */ +#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */ + /* Bit 14 is reserved (was: Arabic Extended) */ + /* Bit 15 Devanagari */ +#define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */ + /* Bit 16 Bengali */ +#define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */ + /* Bit 17 Gurmukhi */ +#define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */ + /* Bit 18 Gujarati */ +#define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */ + /* Bit 19 Oriya */ +#define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */ + /* Bit 20 Tamil */ +#define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */ + /* Bit 21 Telugu */ +#define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */ + /* Bit 22 Kannada */ +#define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */ + /* Bit 23 Malayalam */ +#define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */ + /* Bit 24 Thai */ +#define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */ + /* Bit 25 Lao */ +#define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */ + /* Bit 26 Georgian */ +#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */ + /* Bit 27 is reserved (was Georgian Extended) */ + /* Bit 28 Hangul Jamo */ +#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */ + /* Bit 29 Latin Extended Additional */ +#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */ + /* Bit 30 Greek Extended */ +#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */ + + /* Symbols Area */ + + /* Bit 31 General Punctuation */ +#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */ + /* Bit 32 Superscripts And Subscripts */ +#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */ + /* Bit 33 Currency Symbols */ +#define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */ + /* Bit 34 Combining Diacritical Marks For Symbols */ +#define TT_UCR_COMBINING_DIACRITICS_SYMB (1L << 2) /* U+20D0-U+20FF */ + /* Bit 35 Letterlike Symbols */ +#define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */ + /* Bit 36 Number Forms */ +#define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */ + /* Bit 37 Arrows + */ + /* Supplemental Arrows-A + */ + /* Supplemental Arrows-B */ +#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */ + /* U+27F0-U+27FF */ + /* U+2900-U+297F */ + /* Bit 38 Mathematical Operators + */ + /* Supplemental Mathematical Operators + */ + /* Miscellaneous Mathematical Symbols-A + */ + /* Miscellaneous Mathematical Symbols-B */ +#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */ + /* U+2A00-U+2AFF */ + /* U+27C0-U+27EF */ + /* U+2980-U+29FF */ + /* Bit 39 Miscellaneous Technical */ +#define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */ + /* Bit 40 Control Pictures */ +#define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */ + /* Bit 41 Optical Character Recognition */ +#define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */ + /* Bit 42 Enclosed Alphanumerics */ +#define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */ + /* Bit 43 Box Drawing */ +#define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */ + /* Bit 44 Block Elements */ +#define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */ + /* Bit 45 Geometric Shapes */ +#define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */ + /* Bit 46 Miscellaneous Symbols */ +#define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */ + /* Bit 47 Dingbats */ +#define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */ + + /* CJK Phonetics and Symbols Area */ + + /* Bit 48 CJK Symbols and Punctuation */ +#define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */ + /* Bit 49 Hiragana */ +#define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */ + /* Bit 50 Katakana + */ + /* Katakana Phonetic Extensions */ +#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */ + /* U+31F0-U+31FF */ + /* Bit 51 Bopomofo + */ + /* Bopomofo Extended */ +#define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */ + /* U+31A0-U+31BF */ + /* Bit 52 Hangul Compatibility Jamo */ +#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */ + /* Bit 53 Kanbun */ +#define TT_UCR_CJK_MISC (1L << 21) /* U+3190-U+319F */ +#define TT_UCR_KANBUN TT_UCR_CJK_MISC + /* Bit 54 Enclosed CJK Letters and Months */ +#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */ + /* Bit 55 CJK Compatibility */ +#define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */ + + /* Hangul Syllables Area */ + + /* Bit 56 Hangul */ +#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */ + + /* Surrogates Area */ + + /* Bit 57 High Surrogates + */ + /* High Private Use Surrogates + */ + /* Low Surrogates */ +#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */ + /* U+DB80-U+DBFF */ + /* U+DC00-U+DFFF */ + /* According to OpenType specs v.1.3+, setting bit 57 implies that there */ + /* is at least one codepoint beyond the Basic Multilingual Plane that is */ + /* supported by this font. So it really means: >= U+10000 */ + + /* Bit 58 is reserved for Unicode SubRanges */ + + /* CJK Ideographs Area */ + + /* Bit 59 CJK Unified Ideographs + */ + /* CJK Radicals Supplement + */ + /* Kangxi Radicals + */ + /* Ideographic Description Characters + */ + /* CJK Unified Ideographs Extension A */ + /* CJK Unified Ideographs Extension A + */ + /* CJK Unified Ideographs Extension B + */ + /* Kanbun */ +#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */ + /* U+2E80-U+2EFF */ + /* U+2F00-U+2FDF */ + /* U+2FF0-U+2FFF */ + /* U+3400-U+4DB5 */ + /*U+20000-U+2A6DF*/ + /* U+3190-U+319F */ + + /* Private Use Area */ + + /* Bit 60 Private Use */ +#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */ + + /* Compatibility Area and Specials */ + + /* Bit 61 CJK Compatibility Ideographs + */ + /* CJK Compatibility Ideographs Supplement */ +#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+F900-U+FAFF */ + /*U+2F800-U+2FA1F*/ + /* Bit 62 Alphabetic Presentation Forms */ +#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */ + /* Bit 63 Arabic Presentation Forms-A */ +#define TT_UCR_ARABIC_PRESENTATIONS_A (1L << 31) /* U+FB50-U+FDFF */ + /* Bit 64 Combining Half Marks */ +#define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */ + /* Bit 65 CJK Compatibility Forms */ +#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE30-U+FE4F */ + /* Bit 66 Small Form Variants */ +#define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */ + /* Bit 67 Arabic Presentation Forms-B */ +#define TT_UCR_ARABIC_PRESENTATIONS_B (1L << 3) /* U+FE70-U+FEFE */ + /* Bit 68 Halfwidth and Fullwidth Forms */ +#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */ + /* Bit 69 Specials */ +#define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */ + /* Bit 70 Tibetan */ +#define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */ + /* Bit 71 Syriac */ +#define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */ + /* Bit 72 Thaana */ +#define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */ + /* Bit 73 Sinhala */ +#define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */ + /* Bit 74 Myanmar */ +#define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */ + /* Bit 75 Ethiopic */ +#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */ + /* Bit 76 Cherokee */ +#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */ + /* Bit 77 Unified Canadian Aboriginal Syllabics */ +#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */ + /* Bit 78 Ogham */ +#define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */ + /* Bit 79 Runic */ +#define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */ + /* Bit 80 Khmer */ +#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */ + /* Bit 81 Mongolian */ +#define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */ + /* Bit 82 Braille Patterns */ +#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */ + /* Bit 83 Yi Syllables + */ + /* Yi Radicals */ +#define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */ + /* U+A490-U+A4CF */ + /* Bit 84 Tagalog + */ + /* Hanunoo + */ + /* Buhid + */ + /* Tagbanwa */ +#define TT_UCR_PHILIPPINE (1L << 20) /* U+1700-U+171F */ + /* U+1720-U+173F */ + /* U+1740-U+175F */ + /* U+1760-U+177F */ + /* Bit 85 Old Italic */ +#define TT_UCR_OLD_ITALIC (1L << 21) /*U+10300-U+1032F*/ + /* Bit 86 Gothic */ +#define TT_UCR_GOTHIC (1L << 22) /*U+10330-U+1034F*/ + /* Bit 87 Deseret */ +#define TT_UCR_DESERET (1L << 23) /*U+10400-U+1044F*/ + /* Bit 88 Byzantine Musical Symbols + */ + /* Musical Symbols */ +#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/ + /*U+1D100-U+1D1FF*/ + /* Bit 89 Mathematical Alphanumeric Symbols */ +#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1L << 25) /*U+1D400-U+1D7FF*/ + /* Bit 90 Private Use (plane 15) + */ + /* Private Use (plane 16) */ +#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1L << 26) /*U+F0000-U+FFFFD*/ + /*U+100000-U+10FFFD*/ + /* Bit 91 Variation Selectors */ +#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */ + /* Bit 92 Tags */ +#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/ + + + /*************************************************************************/ + /* */ + /* Some compilers have a very limited length of identifiers. */ + /* */ +#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ ) +#define HAVE_LIMIT_ON_IDENTS +#endif + + +#ifndef HAVE_LIMIT_ON_IDENTS + + + /*************************************************************************/ + /* */ + /* Here some alias #defines in order to be clearer. */ + /* */ + /* These are not always #defined to stay within the 31 character limit */ + /* which some compilers have. */ + /* */ + /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern */ + /* Borland compilers (read: from BC++ 3.1 on) can increase this limit. */ + /* If you get a warning with such a compiler, use the -i40 switch. */ + /* */ +#define TT_UCR_ARABIC_PRESENTATION_FORMS_A \ + TT_UCR_ARABIC_PRESENTATIONS_A +#define TT_UCR_ARABIC_PRESENTATION_FORMS_B \ + TT_UCR_ARABIC_PRESENTATIONS_B + +#define TT_UCR_COMBINING_DIACRITICAL_MARKS \ + TT_UCR_COMBINING_DIACRITICS +#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \ + TT_UCR_COMBINING_DIACRITICS_SYMB + + +#endif /* !HAVE_LIMIT_ON_IDENTS */ + + +FT_END_HEADER + +#endif /* __TTNAMEID_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/tttables.h b/libIGraph/include/freetype/tttables.h new file mode 100644 index 0000000..43eca2e --- /dev/null +++ b/libIGraph/include/freetype/tttables.h @@ -0,0 +1,756 @@ +/***************************************************************************/ +/* */ +/* tttables.h */ +/* */ +/* Basic SFNT/TrueType tables definitions and interface */ +/* (specification only). */ +/* */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTTABLES_H__ +#define __TTTABLES_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /* */ + /* <Section> */ + /* truetype_tables */ + /* */ + /* <Title> */ + /* TrueType Tables */ + /* */ + /* <Abstract> */ + /* TrueType specific table types and functions. */ + /* */ + /* <Description> */ + /* This section contains the definition of TrueType-specific tables */ + /* as well as some routines used to access and process them. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Header */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType font header table. All */ + /* fields follow the TrueType specification. */ + /* */ + typedef struct TT_Header_ + { + FT_Fixed Table_Version; + FT_Fixed Font_Revision; + + FT_Long CheckSum_Adjust; + FT_Long Magic_Number; + + FT_UShort Flags; + FT_UShort Units_Per_EM; + + FT_Long Created [2]; + FT_Long Modified[2]; + + FT_Short xMin; + FT_Short yMin; + FT_Short xMax; + FT_Short yMax; + + FT_UShort Mac_Style; + FT_UShort Lowest_Rec_PPEM; + + FT_Short Font_Direction; + FT_Short Index_To_Loc_Format; + FT_Short Glyph_Data_Format; + + } TT_Header; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_HoriHeader */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType horizontal header, the `hhea' */ + /* table, as well as the corresponding horizontal metrics table, */ + /* i.e., the `hmtx' table. */ + /* */ + /* <Fields> */ + /* Version :: The table version. */ + /* */ + /* Ascender :: The font's ascender, i.e., the distance */ + /* from the baseline to the top-most of all */ + /* glyph points found in the font. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of the */ + /* glyphs found in the font (maybe ASCII). */ + /* */ + /* You should use the `sTypoAscender' field */ + /* of the OS/2 table instead if you want */ + /* the correct one. */ + /* */ + /* Descender :: The font's descender, i.e., the distance */ + /* from the baseline to the bottom-most of */ + /* all glyph points found in the font. It */ + /* is negative. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of the */ + /* glyphs found in the font (maybe ASCII). */ + /* */ + /* You should use the `sTypoDescender' */ + /* field of the OS/2 table instead if you */ + /* want the correct one. */ + /* */ + /* Line_Gap :: The font's line gap, i.e., the distance */ + /* to add to the ascender and descender to */ + /* get the BTB, i.e., the */ + /* baseline-to-baseline distance for the */ + /* font. */ + /* */ + /* advance_Width_Max :: This field is the maximum of all advance */ + /* widths found in the font. It can be */ + /* used to compute the maximum width of an */ + /* arbitrary string of text. */ + /* */ + /* min_Left_Side_Bearing :: The minimum left side bearing of all */ + /* glyphs within the font. */ + /* */ + /* min_Right_Side_Bearing :: The minimum right side bearing of all */ + /* glyphs within the font. */ + /* */ + /* xMax_Extent :: The maximum horizontal extent (i.e., the */ + /* `width' of a glyph's bounding box) for */ + /* all glyphs in the font. */ + /* */ + /* caret_Slope_Rise :: The rise coefficient of the cursor's */ + /* slope of the cursor (slope=rise/run). */ + /* */ + /* caret_Slope_Run :: The run coefficient of the cursor's */ + /* slope. */ + /* */ + /* Reserved :: 10 reserved bytes. */ + /* */ + /* metric_Data_Format :: Always 0. */ + /* */ + /* number_Of_HMetrics :: Number of HMetrics entries in the `hmtx' */ + /* table -- this value can be smaller than */ + /* the total number of glyphs in the font. */ + /* */ + /* long_metrics :: A pointer into the `hmtx' table. */ + /* */ + /* short_metrics :: A pointer into the `hmtx' table. */ + /* */ + /* <Note> */ + /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ + /* be identical except for the names of their fields which */ + /* are different. */ + /* */ + /* This ensures that a single function in the `ttload' */ + /* module is able to read both the horizontal and vertical */ + /* headers. */ + /* */ + typedef struct TT_HoriHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Width_Max; /* advance width maximum */ + + FT_Short min_Left_Side_Bearing; /* minimum left-sb */ + FT_Short min_Right_Side_Bearing; /* minimum right-sb */ + FT_Short xMax_Extent; /* xmax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_HMetrics; + + /* The following fields are not defined by the TrueType specification */ + /* but they are used to connect the metrics header to the relevant */ + /* `HMTX' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_HoriHeader; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_VertHeader */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType vertical header, the `vhea' */ + /* table, as well as the corresponding vertical metrics table, i.e., */ + /* the `vmtx' table. */ + /* */ + /* <Fields> */ + /* Version :: The table version. */ + /* */ + /* Ascender :: The font's ascender, i.e., the distance */ + /* from the baseline to the top-most of */ + /* all glyph points found in the font. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of */ + /* the glyphs found in the font (maybe */ + /* ASCII). */ + /* */ + /* You should use the `sTypoAscender' */ + /* field of the OS/2 table instead if you */ + /* want the correct one. */ + /* */ + /* Descender :: The font's descender, i.e., the */ + /* distance from the baseline to the */ + /* bottom-most of all glyph points found */ + /* in the font. It is negative. */ + /* */ + /* This value is invalid in many fonts, as */ + /* it is usually set by the font designer, */ + /* and often reflects only a portion of */ + /* the glyphs found in the font (maybe */ + /* ASCII). */ + /* */ + /* You should use the `sTypoDescender' */ + /* field of the OS/2 table instead if you */ + /* want the correct one. */ + /* */ + /* Line_Gap :: The font's line gap, i.e., the distance */ + /* to add to the ascender and descender to */ + /* get the BTB, i.e., the */ + /* baseline-to-baseline distance for the */ + /* font. */ + /* */ + /* advance_Height_Max :: This field is the maximum of all */ + /* advance heights found in the font. It */ + /* can be used to compute the maximum */ + /* height of an arbitrary string of text. */ + /* */ + /* min_Top_Side_Bearing :: The minimum top side bearing of all */ + /* glyphs within the font. */ + /* */ + /* min_Bottom_Side_Bearing :: The minimum bottom side bearing of all */ + /* glyphs within the font. */ + /* */ + /* yMax_Extent :: The maximum vertical extent (i.e., the */ + /* `height' of a glyph's bounding box) for */ + /* all glyphs in the font. */ + /* */ + /* caret_Slope_Rise :: The rise coefficient of the cursor's */ + /* slope of the cursor (slope=rise/run). */ + /* */ + /* caret_Slope_Run :: The run coefficient of the cursor's */ + /* slope. */ + /* */ + /* caret_Offset :: The cursor's offset for slanted fonts. */ + /* This value is `reserved' in vmtx */ + /* version 1.0. */ + /* */ + /* Reserved :: 8 reserved bytes. */ + /* */ + /* metric_Data_Format :: Always 0. */ + /* */ + /* number_Of_HMetrics :: Number of VMetrics entries in the */ + /* `vmtx' table -- this value can be */ + /* smaller than the total number of glyphs */ + /* in the font. */ + /* */ + /* long_metrics :: A pointer into the `vmtx' table. */ + /* */ + /* short_metrics :: A pointer into the `vmtx' table. */ + /* */ + /* <Note> */ + /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ + /* be identical except for the names of their fields which */ + /* are different. */ + /* */ + /* This ensures that a single function in the `ttload' */ + /* module is able to read both the horizontal and vertical */ + /* headers. */ + /* */ + typedef struct TT_VertHeader_ + { + FT_Fixed Version; + FT_Short Ascender; + FT_Short Descender; + FT_Short Line_Gap; + + FT_UShort advance_Height_Max; /* advance height maximum */ + + FT_Short min_Top_Side_Bearing; /* minimum left-sb or top-sb */ + FT_Short min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb */ + FT_Short yMax_Extent; /* xmax or ymax extents */ + FT_Short caret_Slope_Rise; + FT_Short caret_Slope_Run; + FT_Short caret_Offset; + + FT_Short Reserved[4]; + + FT_Short metric_Data_Format; + FT_UShort number_Of_VMetrics; + + /* The following fields are not defined by the TrueType specification */ + /* but they're used to connect the metrics header to the relevant */ + /* `HMTX' or `VMTX' table. */ + + void* long_metrics; + void* short_metrics; + + } TT_VertHeader; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_OS2 */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType OS/2 table. This is the long */ + /* table version. All fields comply to the TrueType specification. */ + /* */ + /* Note that we now support old Mac fonts which do not include an */ + /* OS/2 table. In this case, the `version' field is always set to */ + /* 0xFFFF. */ + /* */ + typedef struct TT_OS2_ + { + FT_UShort version; /* 0x0001 - more or 0xFFFF */ + FT_Short xAvgCharWidth; + FT_UShort usWeightClass; + FT_UShort usWidthClass; + FT_Short fsType; + FT_Short ySubscriptXSize; + FT_Short ySubscriptYSize; + FT_Short ySubscriptXOffset; + FT_Short ySubscriptYOffset; + FT_Short ySuperscriptXSize; + FT_Short ySuperscriptYSize; + FT_Short ySuperscriptXOffset; + FT_Short ySuperscriptYOffset; + FT_Short yStrikeoutSize; + FT_Short yStrikeoutPosition; + FT_Short sFamilyClass; + + FT_Byte panose[10]; + + FT_ULong ulUnicodeRange1; /* Bits 0-31 */ + FT_ULong ulUnicodeRange2; /* Bits 32-63 */ + FT_ULong ulUnicodeRange3; /* Bits 64-95 */ + FT_ULong ulUnicodeRange4; /* Bits 96-127 */ + + FT_Char achVendID[4]; + + FT_UShort fsSelection; + FT_UShort usFirstCharIndex; + FT_UShort usLastCharIndex; + FT_Short sTypoAscender; + FT_Short sTypoDescender; + FT_Short sTypoLineGap; + FT_UShort usWinAscent; + FT_UShort usWinDescent; + + /* only version 1 tables: */ + + FT_ULong ulCodePageRange1; /* Bits 0-31 */ + FT_ULong ulCodePageRange2; /* Bits 32-63 */ + + /* only version 2 tables: */ + + FT_Short sxHeight; + FT_Short sCapHeight; + FT_UShort usDefaultChar; + FT_UShort usBreakChar; + FT_UShort usMaxContext; + + } TT_OS2; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_Postscript */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType Postscript table. All fields */ + /* comply to the TrueType specification. This structure does not */ + /* reference the Postscript glyph names, which can be nevertheless */ + /* accessed with the `ttpost' module. */ + /* */ + typedef struct TT_Postscript_ + { + FT_Fixed FormatType; + FT_Fixed italicAngle; + FT_Short underlinePosition; + FT_Short underlineThickness; + FT_ULong isFixedPitch; + FT_ULong minMemType42; + FT_ULong maxMemType42; + FT_ULong minMemType1; + FT_ULong maxMemType1; + + /* Glyph names follow in the file, but we don't */ + /* load them by default. See the ttpost.c file. */ + + } TT_Postscript; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_PCLT */ + /* */ + /* <Description> */ + /* A structure used to model a TrueType PCLT table. All fields */ + /* comply to the TrueType specification. */ + /* */ + typedef struct TT_PCLT_ + { + FT_Fixed Version; + FT_ULong FontNumber; + FT_UShort Pitch; + FT_UShort xHeight; + FT_UShort Style; + FT_UShort TypeFamily; + FT_UShort CapHeight; + FT_UShort SymbolSet; + FT_Char TypeFace[16]; + FT_Char CharacterComplement[8]; + FT_Char FileName[6]; + FT_Char StrokeWeight; + FT_Char WidthType; + FT_Byte SerifStyle; + FT_Byte Reserved; + + } TT_PCLT; + + + /*************************************************************************/ + /* */ + /* <Struct> */ + /* TT_MaxProfile */ + /* */ + /* <Description> */ + /* The maximum profile is a table containing many max values which */ + /* can be used to pre-allocate arrays. This ensures that no memory */ + /* allocation occurs during a glyph load. */ + /* */ + /* <Fields> */ + /* version :: The version number. */ + /* */ + /* numGlyphs :: The number of glyphs in this TrueType */ + /* font. */ + /* */ + /* maxPoints :: The maximum number of points in a */ + /* non-composite TrueType glyph. See also */ + /* the structure element */ + /* `maxCompositePoints'. */ + /* */ + /* maxContours :: The maximum number of contours in a */ + /* non-composite TrueType glyph. See also */ + /* the structure element */ + /* `maxCompositeContours'. */ + /* */ + /* maxCompositePoints :: The maximum number of points in a */ + /* composite TrueType glyph. See also the */ + /* structure element `maxPoints'. */ + /* */ + /* maxCompositeContours :: The maximum number of contours in a */ + /* composite TrueType glyph. See also the */ + /* structure element `maxContours'. */ + /* */ + /* maxZones :: The maximum number of zones used for */ + /* glyph hinting. */ + /* */ + /* maxTwilightPoints :: The maximum number of points in the */ + /* twilight zone used for glyph hinting. */ + /* */ + /* maxStorage :: The maximum number of elements in the */ + /* storage area used for glyph hinting. */ + /* */ + /* maxFunctionDefs :: The maximum number of function */ + /* definitions in the TrueType bytecode for */ + /* this font. */ + /* */ + /* maxInstructionDefs :: The maximum number of instruction */ + /* definitions in the TrueType bytecode for */ + /* this font. */ + /* */ + /* maxStackElements :: The maximum number of stack elements used */ + /* during bytecode interpretation. */ + /* */ + /* maxSizeOfInstructions :: The maximum number of TrueType opcodes */ + /* used for glyph hinting. */ + /* */ + /* maxComponentElements :: The maximum number of simple (i.e., non- */ + /* composite) glyphs in a composite glyph. */ + /* */ + /* maxComponentDepth :: The maximum nesting depth of composite */ + /* glyphs. */ + /* */ + /* <Note> */ + /* This structure is only used during font loading. */ + /* */ + typedef struct TT_MaxProfile_ + { + FT_Fixed version; + FT_UShort numGlyphs; + FT_UShort maxPoints; + FT_UShort maxContours; + FT_UShort maxCompositePoints; + FT_UShort maxCompositeContours; + FT_UShort maxZones; + FT_UShort maxTwilightPoints; + FT_UShort maxStorage; + FT_UShort maxFunctionDefs; + FT_UShort maxInstructionDefs; + FT_UShort maxStackElements; + FT_UShort maxSizeOfInstructions; + FT_UShort maxComponentElements; + FT_UShort maxComponentDepth; + + } TT_MaxProfile; + + + /*************************************************************************/ + /* */ + /* <Enum> */ + /* FT_Sfnt_Tag */ + /* */ + /* <Description> */ + /* An enumeration used to specify the index of an SFNT table. */ + /* Used in the @FT_Get_Sfnt_Table API function. */ + /* */ + typedef enum + { + ft_sfnt_head = 0, + ft_sfnt_maxp = 1, + ft_sfnt_os2 = 2, + ft_sfnt_hhea = 3, + ft_sfnt_vhea = 4, + ft_sfnt_post = 5, + ft_sfnt_pclt = 6, + + sfnt_max /* internal end mark */ + + } FT_Sfnt_Tag; + + /* */ + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_Sfnt_Table */ + /* */ + /* <Description> */ + /* Returns a pointer to a given SFNT table within a face. */ + /* */ + /* <Input> */ + /* face :: A handle to the source. */ + /* */ + /* tag :: The index of the SFNT table. */ + /* */ + /* <Return> */ + /* A type-less pointer to the table. This will be 0 in case of */ + /* error, or if the corresponding table was not found *OR* loaded */ + /* from the file. */ + /* */ + /* <Note> */ + /* The table is owned by the face object and disappears with it. */ + /* */ + /* This function is only useful to access SFNT tables that are loaded */ + /* by the sfnt, truetype, and opentype drivers. See @FT_Sfnt_Tag for */ + /* a list. */ + /* */ + FT_EXPORT( void* ) + FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ); + + + /************************************************************************** + * + * @function: + * FT_Load_Sfnt_Table + * + * @description: + * Loads any font table into client memory. + * + * @input: + * face :: + * A handle to the source face. + * + * tag :: + * The four-byte tag of the table to load. Use the value 0 if you want + * to access the whole font file. Otherwise, you can use one of the + * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new + * one with @FT_MAKE_TAG. + * + * offset :: + * The starting offset in the table (or file if tag == 0). + * + * @output: + * buffer :: + * The target buffer address. The client must ensure that the memory + * array is big enough to hold the data. + * + * @inout: + * length :: + * If the `length' parameter is NULL, then try to load the whole table. + * Return an error code if it fails. + * + * Else, if `*length' is 0, exit immediately while returning the + * table's (or file) full size in it. + * + * Else the number of bytes to read from the table or file, from the + * starting offset. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * If you need to determine the table's length you should first call this + * function with `*length' set to 0, as in the following example: + * + * { + * FT_ULong length = 0; + * + * + * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length ); + * if ( error ) { ... table does not exist ... } + * + * buffer = malloc( length ); + * if ( buffer == NULL ) { ... not enough memory ... } + * + * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length ); + * if ( error ) { ... could not load table ... } + * } + */ + FT_EXPORT( FT_Error ) + FT_Load_Sfnt_Table( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + + /************************************************************************** + * + * @function: + * FT_Sfnt_Table_Info + * + * @description: + * Returns information on an SFNT table. + * + * @input: + * face :: + * A handle to the source face. + * + * table_index :: + * The index of an SFNT table. The function returns + * FT_Err_Table_Missing for an invalid value. + * + * @output: + * tag :: + * The name tag of the SFNT table. + * + * length :: + * The length of the SFNT table. + * + * @return: + * FreeType error code. 0 means success. + * + * @note: + * SFNT tables with length zero are treated as missing by Windows. + * + */ + FT_EXPORT( FT_Error ) + FT_Sfnt_Table_Info( FT_Face face, + FT_UInt table_index, + FT_ULong *tag, + FT_ULong *length ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_CMap_Language_ID */ + /* */ + /* <Description> */ + /* Return TrueType/sfnt specific cmap language ID. Definitions of */ + /* language ID values are in `freetype/ttnameid.h'. */ + /* */ + /* <Input> */ + /* charmap :: */ + /* The target charmap. */ + /* */ + /* <Return> */ + /* The language ID of `charmap'. If `charmap' doesn't belong to a */ + /* TrueType/sfnt face, just return 0 as the default value. */ + /* */ + FT_EXPORT( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ); + + + /*************************************************************************/ + /* */ + /* <Function> */ + /* FT_Get_CMap_Format */ + /* */ + /* <Description> */ + /* Return TrueType/sfnt specific cmap format. */ + /* */ + /* <Input> */ + /* charmap :: */ + /* The target charmap. */ + /* */ + /* <Return> */ + /* The format of `charmap'. If `charmap' doesn't belong to a */ + /* TrueType/sfnt face, return -1. */ + /* */ + FT_EXPORT( FT_Long ) + FT_Get_CMap_Format( FT_CharMap charmap ); + + /* */ + + +FT_END_HEADER + +#endif /* __TTTABLES_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/tttags.h b/libIGraph/include/freetype/tttags.h new file mode 100644 index 0000000..e10244c --- /dev/null +++ b/libIGraph/include/freetype/tttags.h @@ -0,0 +1,99 @@ +/***************************************************************************/ +/* */ +/* tttags.h */ +/* */ +/* Tags for TrueType and OpenType tables (specification only). */ +/* */ +/* Copyright 1996-2001, 2004, 2005 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTAGS_H__ +#define __TTAGS_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + +#define TTAG_avar FT_MAKE_TAG( 'a', 'v', 'a', 'r' ) +#define TTAG_BASE FT_MAKE_TAG( 'B', 'A', 'S', 'E' ) +#define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' ) +#define TTAG_BDF FT_MAKE_TAG( 'B', 'D', 'F', ' ' ) +#define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' ) +#define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' ) +#define TTAG_bsln FT_MAKE_TAG( 'b', 's', 'l', 'n' ) +#define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' ) +#define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' ) +#define TTAG_cvar FT_MAKE_TAG( 'c', 'v', 'a', 'r' ) +#define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' ) +#define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' ) +#define TTAG_EBDT FT_MAKE_TAG( 'E', 'B', 'D', 'T' ) +#define TTAG_EBLC FT_MAKE_TAG( 'E', 'B', 'L', 'C' ) +#define TTAG_EBSC FT_MAKE_TAG( 'E', 'B', 'S', 'C' ) +#define TTAG_feat FT_MAKE_TAG( 'f', 'e', 'a', 't' ) +#define TTAG_fpgm FT_MAKE_TAG( 'f', 'p', 'g', 'm' ) +#define TTAG_fvar FT_MAKE_TAG( 'f', 'v', 'a', 'r' ) +#define TTAG_gasp FT_MAKE_TAG( 'g', 'a', 's', 'p' ) +#define TTAG_GDEF FT_MAKE_TAG( 'G', 'D', 'E', 'F' ) +#define TTAG_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' ) +#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' ) +#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) +#define TTAG_gvar FT_MAKE_TAG( 'g', 'v', 'a', 'r' ) +#define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' ) +#define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' ) +#define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' ) +#define TTAG_hmtx FT_MAKE_TAG( 'h', 'm', 't', 'x' ) +#define TTAG_JSTF FT_MAKE_TAG( 'J', 'S', 'T', 'F' ) +#define TTAG_just FT_MAKE_TAG( 'j', 'u', 's', 't' ) +#define TTAG_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' ) +#define TTAG_lcar FT_MAKE_TAG( 'l', 'c', 'a', 'r' ) +#define TTAG_loca FT_MAKE_TAG( 'l', 'o', 'c', 'a' ) +#define TTAG_LTSH FT_MAKE_TAG( 'L', 'T', 'S', 'H' ) +#define TTAG_maxp FT_MAKE_TAG( 'm', 'a', 'x', 'p' ) +#define TTAG_META FT_MAKE_TAG( 'M', 'E', 'T', 'A' ) +#define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' ) +#define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' ) +#define TTAG_mort FT_MAKE_TAG( 'm', 'o', 'r', 't' ) +#define TTAG_morx FT_MAKE_TAG( 'm', 'o', 'r', 'x' ) +#define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' ) +#define TTAG_opbd FT_MAKE_TAG( 'o', 'p', 'b', 'd' ) +#define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' ) +#define TTAG_OTTO FT_MAKE_TAG( 'O', 'T', 'T', 'O' ) +#define TTAG_PCLT FT_MAKE_TAG( 'P', 'C', 'L', 'T' ) +#define TTAG_post FT_MAKE_TAG( 'p', 'o', 's', 't' ) +#define TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' ) +#define TTAG_prop FT_MAKE_TAG( 'p', 'r', 'o', 'p' ) +#define TTAG_SING FT_MAKE_TAG( 'S', 'I', 'N', 'G' ) +#define TTAG_trak FT_MAKE_TAG( 't', 'r', 'a', 'k' ) +#define TTAG_true FT_MAKE_TAG( 't', 'r', 'u', 'e' ) +#define TTAG_ttc FT_MAKE_TAG( 't', 't', 'c', ' ' ) +#define TTAG_ttcf FT_MAKE_TAG( 't', 't', 'c', 'f' ) +#define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' ) +#define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' ) +#define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' ) + + +FT_END_HEADER + +#endif /* __TTAGS_H__ */ + + +/* END */ diff --git a/libIGraph/include/freetype/ttunpat.h b/libIGraph/include/freetype/ttunpat.h new file mode 100644 index 0000000..a016275 --- /dev/null +++ b/libIGraph/include/freetype/ttunpat.h @@ -0,0 +1,59 @@ +/***************************************************************************/ +/* */ +/* ttunpat.h */ +/* */ +/* Definitions for the unpatented TrueType hinting system */ +/* */ +/* Copyright 2003, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* Written by Graham Asher <graham.asher@btinternet.com> */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifndef __TTUNPAT_H__ +#define __TTUNPAT_H__ + + +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifdef FREETYPE_H +#error "freetype.h of FreeType 1 has been loaded!" +#error "Please fix the directory search order for header files" +#error "so that freetype.h of FreeType 2 is found first." +#endif + + +FT_BEGIN_HEADER + + + /*************************************************************************** + * + * @constant: + * FT_PARAM_TAG_UNPATENTED_HINTING + * + * @description: + * A constant used as the tag of an @FT_Parameter structure to indicate + * that unpatented methods only should be used by the TrueType bytecode + * interpreter for a typeface opened by @FT_Open_Face. + * + */ +#define FT_PARAM_TAG_UNPATENTED_HINTING FT_MAKE_TAG( 'u', 'n', 'p', 'a' ) + + /* */ + +FT_END_HEADER + + +#endif /* __TTUNPAT_H__ */ + + +/* END */ diff --git a/libIGraph/include/ft2build.h b/libIGraph/include/ft2build.h new file mode 100644 index 0000000..41e6e6b --- /dev/null +++ b/libIGraph/include/ft2build.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* ft2build.h */ +/* */ +/* FreeType 2 build and setup macros. */ +/* (Generic version) */ +/* */ +/* Copyright 1996-2001, 2006 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This file corresponds to the default `ft2build.h' file for */ + /* FreeType 2. It uses the `freetype' include root. */ + /* */ + /* Note that specific platforms might use a different configuration. */ + /* See builds/unix/ft2unix.h for an example. */ + /* */ + /*************************************************************************/ + + +#ifndef __FT2_BUILD_GENERIC_H__ +#define __FT2_BUILD_GENERIC_H__ + +#include <freetype/config/ftheader.h> + +#endif /* __FT2_BUILD_GENERIC_H__ */ + + +/* END */ diff --git a/libIGraph/jidctflt.c b/libIGraph/jidctflt.c new file mode 100644 index 0000000..e4e75c0 --- /dev/null +++ b/libIGraph/jidctflt.c @@ -0,0 +1,269 @@ +/* + * jidctflt.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * + * The authors make NO WARRANTY or representation, either express or implied, + * with respect to this software, its quality, accuracy, merchantability, or + * fitness for a particular purpose. This software is provided "AS IS", and you, + * its user, assume the entire risk as to its quality and accuracy. + * + * This software is copyright (C) 1991-1998, Thomas G. Lane. + * All Rights Reserved except as specified below. + * + * Permission is hereby granted to use, copy, modify, and distribute this + * software (or portions thereof) for any purpose, without fee, subject to these + * conditions: + * (1) If any part of the source code for this software is distributed, then this + * README file must be included, with this copyright and no-warranty notice + * unaltered; and any additions, deletions, or changes to the original files + * must be clearly indicated in accompanying documentation. + * (2) If only executable code is distributed, then the accompanying + * documentation must state that "this software is based in part on the work of + * the Independent JPEG Group". + * (3) Permission for use of this software is granted only if the user accepts + * full responsibility for any undesirable consequences; the authors accept + * NO LIABILITY for damages of any kind. + * + * These conditions apply to any software derived from or based on the IJG code, + * not just to the unmodified library. If you use our work, you ought to + * acknowledge us. + * + * Permission is NOT granted for the use of any IJG author's name or company name + * in advertising or publicity relating to this software or products derived from + * it. This software may be referred to only as "the Independent JPEG Group's + * software". + * + * We specifically permit and encourage the use of this software as the basis of + * commercial products, provided that all warranty or liability claims are + * assumed by the product vendor. + * + * + * This file contains a floating-point implementation of the + * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine + * must also perform dequantization of the input coefficients. + * + * This implementation should be more accurate than either of the integer + * IDCT implementations. However, it may not give the same results on all + * machines because of differences in roundoff behavior. Speed will depend + * on the hardware's floating point capacity. + * + * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT + * on each row (or vice versa, but it's more convenient to emit a row at + * a time). Direct algorithms are also available, but they are much more + * complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with a fixed-point + * implementation, accuracy is lost due to imprecise representation of the + * scaled quantization values. However, that problem does not arise if + * we use floating point arithmetic. + */ + +#include "libIGraph.h" + +#include "tinyjpeg-internal.h" + +#define DCTSIZE 8 +#define DCTSIZE2 (DCTSIZE*DCTSIZE) + +#define DEQUANTIZE(coef,quantval) DCT_DESCALE1(((int)coef) * (quantval)) + +static unsigned char descale_and_clamp(int x, int shift) +{ + x += (1UL<<(shift-1)); + if (x<0) + x = (x >> shift) | ((~(0UL)) << (32-(shift))); + else + x >>= shift; + x += 128; + if (x>255) + return 255; + else if (x<0) + return 0; + else + return x; +} + +/* + * Perform dequantization and inverse DCT on one block of coefficients. +Note: This has been hacked to use integer fixed-point calculations + as many embedded platforms don't have fast floating point units (if they have them at all) + */ + +void +tinyjpeg_idct_float (struct component *compptr, uint8_t *output_buf, int stride) +{ + int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + int tmp10, tmp11, tmp12, tmp13; + int z5, z10, z11, z12, z13; + int16_t *inptr; + int *quantptr; + int *wsptr; + uint8_t *outptr; + int ctr; + int workspace[DCTSIZE2]; /* buffers data between passes */ + + /* Pass 1: process columns from input, store into work array. */ + + inptr = compptr->DCT; + quantptr = compptr->Q_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = tmp0 + tmp2; /* phase 3 */ + tmp11 = tmp0 - tmp2; + + tmp13 = tmp1 + tmp3; /* phases 5-3 */ + tmp12 = DCT_DESCALE1((tmp1 - tmp3) * (DCT_FIX(1.414213562))) - tmp13; /* 2*c4 */ + + tmp0 = tmp10 + tmp13; /* phase 2 */ + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + z13 = tmp6 + tmp5; /* phase 6 */ + z10 = tmp6 - tmp5; + z11 = tmp4 + tmp7; + z12 = tmp4 - tmp7; + + tmp7 = z11 + z13; /* phase 5 */ + tmp11 = DCT_DESCALE1((z11 - z13) * (DCT_FIX(1.414213562))); /* 2*c4 */ + + z5 = DCT_DESCALE1((z10 + z12) * (DCT_FIX(1.847759065))); /* 2*c2 */ + tmp10 = DCT_DESCALE1((DCT_FIX(1.082392200)) * z12) - z5; /* 2*(c2-c6) */ + tmp12 = DCT_DESCALE1((DCT_FIX(-2.613125930)) * z10) + z5; /* -2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; /* phase 2 */ + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + wsptr[DCTSIZE*0] = tmp0 + tmp7; + wsptr[DCTSIZE*7] = tmp0 - tmp7; + wsptr[DCTSIZE*1] = tmp1 + tmp6; + wsptr[DCTSIZE*6] = tmp1 - tmp6; + wsptr[DCTSIZE*2] = tmp2 + tmp5; + wsptr[DCTSIZE*5] = tmp2 - tmp5; + wsptr[DCTSIZE*4] = tmp3 + tmp4; + wsptr[DCTSIZE*3] = tmp3 - tmp4; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3. */ + + wsptr = workspace; + outptr = output_buf; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + /* Rows of zeroes can be exploited in the same way as we did with columns. + * However, the column calculation has created many nonzero AC terms, so + * the simplification applies less often (typically 5% to 10% of the time). + * And testing floats for zero is relatively expensive, so we don't bother. + */ + + /* Even part */ + + tmp10 = wsptr[0] + wsptr[4]; + tmp11 = wsptr[0] - wsptr[4]; + + tmp13 = wsptr[2] + wsptr[6]; + tmp12 = DCT_DESCALE1((wsptr[2] - wsptr[6]) * (DCT_FIX(1.414213562))) - tmp13; + + tmp0 = tmp10 + tmp13; + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + z13 = wsptr[5] + wsptr[3]; + z10 = wsptr[5] - wsptr[3]; + z11 = wsptr[1] + wsptr[7]; + z12 = wsptr[1] - wsptr[7]; + + tmp7 = z11 + z13; + tmp11 = DCT_DESCALE1((z11 - z13) * (DCT_FIX(1.414213562))); + + z5 = DCT_DESCALE1((z10 + z12) * (DCT_FIX(1.847759065))); /* 2*c2 */ + tmp10 = DCT_DESCALE1((DCT_FIX(1.082392200)) * z12) - z5; /* 2*(c2-c6) */ + tmp12 = DCT_DESCALE1((DCT_FIX(-2.613125930)) * z10) + z5; /* -2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + /* Final output stage: scale down by a factor of 8 and range-limit */ + + outptr[0] = descale_and_clamp((int)(tmp0 + tmp7), 3); + outptr[7] = descale_and_clamp((int)(tmp0 - tmp7), 3); + outptr[1] = descale_and_clamp((int)(tmp1 + tmp6), 3); + outptr[6] = descale_and_clamp((int)(tmp1 - tmp6), 3); + outptr[2] = descale_and_clamp((int)(tmp2 + tmp5), 3); + outptr[5] = descale_and_clamp((int)(tmp2 - tmp5), 3); + outptr[4] = descale_and_clamp((int)(tmp3 + tmp4), 3); + outptr[3] = descale_and_clamp((int)(tmp3 - tmp4), 3); + + + wsptr += DCTSIZE; /* advance pointer to next row */ + outptr += stride; + } +} + diff --git a/libIGraph/lib/freetype.lib b/libIGraph/lib/freetype.lib new file mode 100644 index 0000000..be96e47 --- /dev/null +++ b/libIGraph/lib/freetype.lib Binary files differ diff --git a/libIGraph/libIGraph.c b/libIGraph/libIGraph.c new file mode 100644 index 0000000..79d3dd4 --- /dev/null +++ b/libIGraph/libIGraph.c @@ -0,0 +1,21 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#include "libIGraph.h" diff --git a/libIGraph/libIGraph.def b/libIGraph/libIGraph.def new file mode 100644 index 0000000..832cbdb --- /dev/null +++ b/libIGraph/libIGraph.def @@ -0,0 +1,41 @@ +LIBRARY "libIGraph" +EXPORTS + GetScreen @1 + DisposeGraphics @2 + Clear @3 + CreatePen_Color @4 + DisposePen @5 + DrawLine_Ints @6 + FillRectangle_Ints @7 + CreateBrush_Solid @8 + DisposeBrush @9 + CreateFontFamily_Name @10 + _CreateFont @11 + DrawString @12 + DisposeFont @13 + DisposeFontFamily @14 + CreateStringFormat @15 + DisposeStringFormat @16 + StringFormat_SetTrimming @17 + TextRenderingHint_Set @18 + _CreateBitmap @19 + GetGraphicsFromImage @20 + DrawImageUnscaled @21 + DisposeImage @22 + BitmapFromFile @23 + StringFormat_SetAlignment @24 + StringFormat_SetLineAlignment @25 + StringFormat_SetFormatFlags @26 + CreateBrush_Hatch @27 + IsKeyDown_Internal @28 + LatestKeyUp_Internal @29 + LatestKeyDown_Internal @30 + CreateBrush_LinearGradient @31 + CreateRegion_Rect @32 + DisposeRegion @33 + Graphics_SetClip @34 + CreateRegion_Infinite @35 + MeasureString @36 + DrawEllipse_Ints @37 + FillEllipse_Ints @38 + Graphics_CopyFromScreen @39 \ No newline at end of file diff --git a/libIGraph/libIGraph.h b/libIGraph/libIGraph.h new file mode 100644 index 0000000..7914025 --- /dev/null +++ b/libIGraph/libIGraph.h @@ -0,0 +1,105 @@ +// Copyright (c) 2009 DotNetAnywhere +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +#ifndef __LIBIGRAPH_H +#define __LIBIGRAPH_H + +#include "Config.h" + +// Bitmap format indexes used in the function look-ups. +#define FMT_NUM 2 +#define FMT_4BPP_GRAY 0 +#define FMT_32BPP_ARGB 1 + +#define TMALLOC(type) (type*)malloc(sizeof(type)) + +#define PT_TO_PIXEL_X(pt) ((I32)(((pt) * 84) / 57)) +#define PT_TO_PIXEL_Y(pt) ((I32)(((pt) * 84) / 57)) + +#define ABS(x) (((x)<0)?(-(x)):(x)) +#define SWAP_I32(a,b) {I32 __tmp = a;a=b;b=__tmp;} + +#define A(col) ((col) >> 24) +#define R(col) (((col) >> 16) & 0xff) +#define G(col) (((col) >> 8) & 0xff) +#define B(col) ((col) & 0xff) +#define ARGB(a,r,g,b) ((U32)(((a) << 24) | (((r) & 0xff) << 16) | (((g) & 0xff) << 8) | ((b) & 0xff))) + +// A crude approximation of R*0.3 + G*0.59 + B*0.11 +#define COL2GRAY(col) ((R(col) >> 2) + (G(col) >> 1) + (B(col) >> 2)) + +typedef unsigned char* STRING; +typedef unsigned short* STRING2; + +#ifdef WIN32 + +#pragma warning(disable:4996) + +typedef int I32; +typedef unsigned int U32; +typedef short I16; +typedef unsigned short U16; +typedef char I8; +typedef unsigned char U8; + +typedef U16 uint16_t; +typedef I16 int16_t; +typedef U8 uint8_t; +typedef I8 int8_t; + +#define EXPORT(returnType) __declspec(dllexport) returnType __stdcall + +#undef INVERT_4BPP_GRAY + +#define DIR_SEPARATOR "\\" + +#include <windows.h> +#include <io.h> + +#define snprintf _snprintf + +#else + +#include <sys/types.h> +#include <sys/mman.h> +#include <unistd.h> + +#define EXPORT(returnType) returnType + +#define INVERT_4BPP_GRAY + +#define DIR_SEPARATOR "/" + +#define O_BINARY 0 + +typedef U16 uint16_t; +typedef U8 uint8_t; + +#endif + +#define inline + +#define FONT_DIR "." DIR_SEPARATOR "Fonts" DIR_SEPARATOR + +#include <stdlib.h> +#include <stdio.h> +#include <fcntl.h> + +#endif diff --git a/libIGraph/libIGraph.vcproj b/libIGraph/libIGraph.vcproj new file mode 100644 index 0000000..b946da6 --- /dev/null +++ b/libIGraph/libIGraph.vcproj @@ -0,0 +1,373 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="libIGraph" + ProjectGUID="{E8C90D0B-0F97-485C-8765-FC14202EF252}" + RootNamespace="libIGraph" + Keyword="Win32Proj" + TargetFrameworkVersion="131072" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(ProjectDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + AdditionalIncludeDirectories="include;include/freetype2" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBIGRAPH_EXPORTS" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + CompileAs="1" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="lib\freetype.lib" + LinkIncremental="2" + ModuleDefinitionFile="libIGraph.def" + GenerateDebugInformation="true" + SubSystem="2" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="copy $(TargetDir)$(TargetFileName) $(SolutionDir)Builds\$(ConfigurationName)\ copy $(ProjectDir)\freetype.dll $(SolutionDir)Builds\$(ConfigurationName)\" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(ProjectDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="1" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalIncludeDirectories="include;include/freetype2" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBIGRAPH_EXPORTS" + RuntimeLibrary="2" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + AdditionalDependencies="lib\freetype.lib" + LinkIncremental="1" + ModuleDefinitionFile="libIGraph.def" + GenerateDebugInformation="true" + SubSystem="2" + OptimizeReferences="2" + EnableCOMDATFolding="2" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + CommandLine="copy $(TargetPath) $(SolutionDir)\dna\" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <Filter + Name="Source Files" + Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" + UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" + > + <File + RelativePath=".\Bitmap.c" + > + </File> + <File + RelativePath=".\BitmapLoader.c" + > + </File> + <File + RelativePath=".\Brush.c" + > + </File> + <File + RelativePath=".\DrawEllipses.c" + > + </File> + <File + RelativePath=".\DrawLines.c" + > + </File> + <File + RelativePath=".\DrawRectangles.c" + > + </File> + <File + RelativePath=".\Exports.c" + > + </File> + <File + RelativePath=".\Font.c" + > + </File> + <File + RelativePath=".\FontFamily.c" + > + </File> + <File + RelativePath=".\GetScreen.c" + > + </File> + <File + RelativePath=".\Graphics.c" + > + </File> + <File + RelativePath=".\Image.c" + > + </File> + <File + RelativePath=".\libIGraph.c" + > + </File> + <File + RelativePath=".\libIGraph.def" + > + </File> + <File + RelativePath=".\Pen.c" + > + </File> + <File + RelativePath=".\Pixels.c" + > + </File> + <File + RelativePath=".\Region.c" + > + </File> + <File + RelativePath=".\StringFormat.c" + > + </File> + <File + RelativePath=".\Text.c" + > + </File> + <Filter + Name="JPEG" + > + <File + RelativePath=".\jidctflt.c" + > + </File> + <File + RelativePath=".\tinyjpeg.c" + > + </File> + </Filter> + </Filter> + <Filter + Name="Header Files" + Filter="h;hpp;hxx;hm;inl;inc;xsd" + UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" + > + <File + RelativePath=".\Bitmap.h" + > + </File> + <File + RelativePath=".\Brush.h" + > + </File> + <File + RelativePath=".\Config.h" + > + </File> + <File + RelativePath=".\DrawEllipses.h" + > + </File> + <File + RelativePath=".\DrawLines.h" + > + </File> + <File + RelativePath=".\DrawRectangles.h" + > + </File> + <File + RelativePath=".\Font.h" + > + </File> + <File + RelativePath=".\FontFamily.h" + > + </File> + <File + RelativePath=".\GetScreen.h" + > + </File> + <File + RelativePath=".\Graphics.h" + > + </File> + <File + RelativePath=".\HatchBrushDefs.h" + > + </File> + <File + RelativePath=".\Image.h" + > + </File> + <File + RelativePath=".\libIGraph.h" + > + </File> + <File + RelativePath=".\Pen.h" + > + </File> + <File + RelativePath=".\Pixels.h" + > + </File> + <File + RelativePath=".\Region.h" + > + </File> + <File + RelativePath=".\StringFormat.h" + > + </File> + <File + RelativePath=".\Text.h" + > + </File> + <Filter + Name="JPEG" + > + <File + RelativePath=".\tinyjpeg-internal.h" + > + </File> + <File + RelativePath=".\tinyjpeg.h" + > + </File> + </Filter> + </Filter> + <Filter + Name="Resource Files" + Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" + UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" + > + </Filter> + </Files> + <Globals> + </Globals> +</VisualStudioProject> diff --git a/libIGraph/tinyjpeg-internal.h b/libIGraph/tinyjpeg-internal.h new file mode 100644 index 0000000..de30eaf --- /dev/null +++ b/libIGraph/tinyjpeg-internal.h @@ -0,0 +1,133 @@ +/* + * Small jpeg decoder library (Internal header) + * + * Copyright (c) 2006, Luc Saillard <luc@saillard.org> + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of the author nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + + +#ifndef __TINYJPEG_INTERNAL_H_ +#define __TINYJPEG_INTERNAL_H_ + +#include <setjmp.h> + +#define SANITY_CHECK 1 + +struct jdec_private; + +#define DCT_SCALE 10 +#define DCT_FIX(x) ((int)(x * (1 << DCT_SCALE))) +#define DCT_DESCALE1(x) (x >> DCT_SCALE) + +#define HUFFMAN_BITS_SIZE 256 +#define HUFFMAN_HASH_NBITS 9 +#define HUFFMAN_HASH_SIZE (1UL<<HUFFMAN_HASH_NBITS) +#define HUFFMAN_HASH_MASK (HUFFMAN_HASH_SIZE-1) + +#define HUFFMAN_TABLES 4 +#define COMPONENTS 3 +#define JPEG_MAX_WIDTH 2048 +#define JPEG_MAX_HEIGHT 2048 + +struct huffman_table +{ + /* Fast look up table, using HUFFMAN_HASH_NBITS bits we can have directly the symbol, + * if the symbol is <0, then we need to look into the tree table */ + short int lookup[HUFFMAN_HASH_SIZE]; + /* code size: give the number of bits of a symbol is encoded */ + unsigned char code_size[HUFFMAN_HASH_SIZE]; + /* some place to store value that is not encoded in the lookup table + * FIXME: Calculate if 256 value is enough to store all values + */ + uint16_t slowtable[16-HUFFMAN_HASH_NBITS][256]; +}; + +struct component +{ + unsigned int Hfactor; + unsigned int Vfactor; + int *Q_table; /* Pointer to the quantisation table to use */ + struct huffman_table *AC_table; + struct huffman_table *DC_table; + short int previous_DC; /* Previous DC coefficient */ + short int DCT[64]; /* DCT coef */ +#if SANITY_CHECK + unsigned int cid; +#endif +}; + + +typedef void (*decode_MCU_fct) (struct jdec_private *priv); +typedef void (*convert_colorspace_fct) (struct jdec_private *priv); + +struct jdec_private +{ + /* Public variables */ + uint8_t *components[COMPONENTS]; + unsigned int width, height; /* Size of the image */ + unsigned int flags; + + /* Private variables */ + const unsigned char *stream_begin, *stream_end; + unsigned int stream_length; + + const unsigned char *stream; /* Pointer to the current stream */ + unsigned int reservoir, nbits_in_reservoir; + + struct component component_infos[COMPONENTS]; + int Q_tables[COMPONENTS][64]; /* quantization tables */ + struct huffman_table HTDC[HUFFMAN_TABLES]; /* DC huffman tables */ + struct huffman_table HTAC[HUFFMAN_TABLES]; /* AC huffman tables */ + int default_huffman_table_initialized; + int restart_interval; + int restarts_to_go; /* MCUs left in this restart interval */ + int last_rst_marker_seen; /* Rst marker is incremented each time */ + + /* Temp space used after the IDCT to store each components */ + uint8_t Y[64*4], Cr[64], Cb[64]; + + jmp_buf jump_state; + /* Internal Pointer use for colorspace conversion, do not modify it !!! */ + uint8_t *plane[COMPONENTS]; + +}; + +#if defined(__GNUC__) && (__GNUC__ > 3) && defined(__OPTIMIZE__) +#define __likely(x) __builtin_expect(!!(x), 1) +#define __unlikely(x) __builtin_expect(!!(x), 0) +#else +#define __likely(x) (x) +#define __unlikely(x) (x) +#endif + +#define IDCT tinyjpeg_idct_float +void tinyjpeg_idct_float (struct component *compptr, uint8_t *output_buf, int stride); + +#endif + diff --git a/libIGraph/tinyjpeg.c b/libIGraph/tinyjpeg.c new file mode 100644 index 0000000..5ec3f3e --- /dev/null +++ b/libIGraph/tinyjpeg.c @@ -0,0 +1,2185 @@ +/* +* Small jpeg decoder library +* +* Copyright (c) 2006, Luc Saillard <luc@saillard.org> +* All rights reserved. +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* - Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* +* - Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* - Neither the name of the author nor the names of its contributors may be +* used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +*/ + +#include "libIGraph.h" + +#include "tinyjpeg.h" +#include "tinyjpeg-internal.h" + +enum std_markers { + DQT = 0xDB, /* Define Quantization Table */ + SOF = 0xC0, /* Start of Frame (size information) */ + DHT = 0xC4, /* Huffman Table */ + SOI = 0xD8, /* Start of Image */ + SOS = 0xDA, /* Start of Scan */ + RST = 0xD0, /* Reset Marker d0 -> .. */ + RST7 = 0xD7, /* Reset Marker .. -> d7 */ + EOI = 0xD9, /* End of Image */ + DRI = 0xDD, /* Define Restart Interval */ + APP0 = 0xE0, +}; + +#define cY 0 +#define cCb 1 +#define cCr 2 + +#define BLACK_Y 0 +#define BLACK_U 127 +#define BLACK_V 127 + +/*#if DEBUG +#define trace(fmt, args...) do { \ +fprintf(stderr, fmt, ## args); \ +fflush(stderr); \ +} while(0) +#else +#define trace(fmt, args...) do { } while (0) +#endif*/ +#define error0(fmt) do { \ + snprintf(error_string, sizeof(error_string), fmt); \ + return -1; \ + } while(0) +#define error1(fmt, a) do { \ + snprintf(error_string, sizeof(error_string), fmt, a); \ + return -1; \ + } while(0) +#define error2(fmt, a, b) do { \ + snprintf(error_string, sizeof(error_string), fmt, a, b); \ + return -1; \ + } while(0) +#define error4(fmt, a, b, c, d) do { \ + snprintf(error_string, sizeof(error_string), fmt, a, b, c, d); \ + return -1; \ + } while(0) + + +#if 0 +static char *print_bits(unsigned int value, char *bitstr) +{ + int i, j; + i=31; + while (i>0) + { + if (value & (1UL<<i)) + break; + i--; + } + j=0; + while (i>=0) + { + bitstr[j++] = (value & (1UL<<i))?'1':'0'; + i--; + } + bitstr[j] = 0; + return bitstr; +} + +static void print_next_16bytes(int offset, const unsigned char *stream) +{ + trace("%4.4x: %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n", + offset, + stream[0], stream[1], stream[2], stream[3], + stream[4], stream[5], stream[6], stream[7], + stream[8], stream[9], stream[10], stream[11], + stream[12], stream[13], stream[14], stream[15]); +} + +#endif + +/* Global variable to return the last error found while deconding */ +static char error_string[256]; + +static const unsigned char zigzag[64] = +{ + 0, 1, 5, 6, 14, 15, 27, 28, + 2, 4, 7, 13, 16, 26, 29, 42, + 3, 8, 12, 17, 25, 30, 41, 43, + 9, 11, 18, 24, 31, 40, 44, 53, + 10, 19, 23, 32, 39, 45, 52, 54, + 20, 22, 33, 38, 46, 51, 55, 60, + 21, 34, 37, 47, 50, 56, 59, 61, + 35, 36, 48, 49, 57, 58, 62, 63 +}; + +/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ +/* IMPORTANT: these are only valid for 8-bit data precision! */ +static const unsigned char bits_dc_luminance[17] = +{ + 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 +}; +static const unsigned char val_dc_luminance[] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 +}; + +static const unsigned char bits_dc_chrominance[17] = +{ + 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 +}; +static const unsigned char val_dc_chrominance[] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 +}; + +static const unsigned char bits_ac_luminance[17] = +{ + 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d +}; +static const unsigned char val_ac_luminance[] = +{ + 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, + 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, + 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, + 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, + 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, + 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, + 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, + 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa +}; + +static const unsigned char bits_ac_chrominance[17] = +{ + 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 +}; + +static const unsigned char val_ac_chrominance[] = +{ + 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, + 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, + 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, + 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, + 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, + 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, + 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, + 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa +}; + + +/* +* 4 functions to manage the stream +* +* fill_nbits: put at least nbits in the reservoir of bits. +* But convert any 0xff,0x00 into 0xff +* get_nbits: read nbits from the stream, and put it in result, +* bits is removed from the stream and the reservoir is filled +* automaticaly. The result is signed according to the number of +* bits. +* look_nbits: read nbits from the stream without marking as read. +* skip_nbits: read nbits from the stream but do not return the result. +* +* stream: current pointer in the jpeg data (read bytes per bytes) +* nbits_in_reservoir: number of bits filled into the reservoir +* reservoir: register that contains bits information. Only nbits_in_reservoir +* is valid. +* nbits_in_reservoir +* <-- 17 bits --> +* Ex: 0000 0000 1010 0000 1111 0000 <== reservoir +* ^ +* bit 1 +* To get two bits from this example +* result = (reservoir >> 15) & 3 +* +*/ +#define fill_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted) do { \ + while (nbits_in_reservoir<nbits_wanted) \ +{ \ + unsigned char c; \ + if (stream >= priv->stream_end) \ + longjmp(priv->jump_state, -EOI); \ + c = *stream++; \ + reservoir <<= 8; \ + if (c == 0xff && *stream == 0x00) \ + stream++; \ + reservoir |= c; \ + nbits_in_reservoir+=8; \ + } \ + } while(0); + +/* Signed version !!!! */ +#define get_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted,result) do { \ + fill_nbits(reservoir,nbits_in_reservoir,stream,(nbits_wanted)); \ + result = ((reservoir)>>(nbits_in_reservoir-(nbits_wanted))); \ + nbits_in_reservoir -= (nbits_wanted); \ + reservoir &= ((1U<<nbits_in_reservoir)-1); \ + if ((unsigned int)result < (1UL<<((nbits_wanted)-1))) \ + result += (0xFFFFFFFFUL<<(nbits_wanted))+1; \ + } while(0); + +#define look_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted,result) do { \ + fill_nbits(reservoir,nbits_in_reservoir,stream,(nbits_wanted)); \ + result = ((reservoir)>>(nbits_in_reservoir-(nbits_wanted))); \ + } while(0); + +/* To speed up the decoding, we assume that the reservoir have enough bit +* slow version: +* #define skip_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted) do { \ +* fill_nbits(reservoir,nbits_in_reservoir,stream,(nbits_wanted)); \ +* nbits_in_reservoir -= (nbits_wanted); \ +* reservoir &= ((1U<<nbits_in_reservoir)-1); \ +* } while(0); +*/ +#define skip_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted) do { \ + nbits_in_reservoir -= (nbits_wanted); \ + reservoir &= ((1U<<nbits_in_reservoir)-1); \ + } while(0); + + +#define be16_to_cpu(x) (((x)[0]<<8)|(x)[1]) + +static void resync(struct jdec_private *priv); + +/** +* Get the next (valid) huffman code in the stream. +* +* To speedup the procedure, we look HUFFMAN_HASH_NBITS bits and the code is +* lower than HUFFMAN_HASH_NBITS we have automaticaly the length of the code +* and the value by using two lookup table. +* Else if the value is not found, just search (linear) into an array for each +* bits is the code is present. +* +* If the code is not present for any reason, -1 is return. +*/ +static int get_next_huffman_code(struct jdec_private *priv, struct huffman_table *huffman_table) +{ + int value, hcode; + unsigned int extra_nbits, nbits; + uint16_t *slowtable; + + look_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, HUFFMAN_HASH_NBITS, hcode); + value = huffman_table->lookup[hcode]; + if (__likely(value >= 0)) + { + unsigned int code_size = huffman_table->code_size[value]; + skip_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, code_size); + return value; + } + + /* Decode more bits each time ... */ + for (extra_nbits=0; extra_nbits<16-HUFFMAN_HASH_NBITS; extra_nbits++) + { + nbits = HUFFMAN_HASH_NBITS + 1 + extra_nbits; + + look_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, nbits, hcode); + slowtable = huffman_table->slowtable[extra_nbits]; + /* Search if the code is in this array */ + while (slowtable[0]) { + if (slowtable[0] == hcode) { + skip_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, nbits); + return slowtable[1]; + } + slowtable+=2; + } + } + return 0; +} + + + + +/** +* +* Decode a single block that contains the DCT coefficients. +* The table coefficients is already dezigzaged at the end of the operation. +* +*/ +static void process_Huffman_data_unit(struct jdec_private *priv, int component) +{ + unsigned char j; + unsigned int huff_code; + unsigned char size_val, count_0; + + struct component *c = &priv->component_infos[component]; + short int DCT[64]; + + + /* Initialize the DCT coef table */ + memset(DCT, 0, sizeof(DCT)); + + /* DC coefficient decoding */ + huff_code = get_next_huffman_code(priv, c->DC_table); + //trace("+ %x\n", huff_code); + if (huff_code) { + get_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, huff_code, DCT[0]); + DCT[0] += c->previous_DC; + c->previous_DC = DCT[0]; + } else { + DCT[0] = c->previous_DC; + } + + /* AC coefficient decoding */ + j = 1; + while (j<64) + { + huff_code = get_next_huffman_code(priv, c->AC_table); + //trace("- %x\n", huff_code); + + size_val = huff_code & 0xF; + count_0 = huff_code >> 4; + + if (size_val == 0) + { /* RLE */ + if (count_0 == 0) + break; /* EOB found, go out */ + else if (count_0 == 0xF) + j += 16; /* skip 16 zeros */ + } + else + { + j += count_0; /* skip count_0 zeroes */ + if (__unlikely(j >= 64)) + { + snprintf(error_string, sizeof(error_string), "Bad huffman data (buffer overflow)"); + break; + } + get_nbits(priv->reservoir, priv->nbits_in_reservoir, priv->stream, size_val, DCT[j]); + j++; + } + } + + for (j = 0; j < 64; j++) + c->DCT[j] = DCT[zigzag[j]]; +} + +/* +* Takes two array of bits, and build the huffman table for size, and code +* +* lookup will return the symbol if the code is less or equal than HUFFMAN_HASH_NBITS. +* code_size will be used to known how many bits this symbol is encoded. +* slowtable will be used when the first lookup didn't give the result. +*/ +static void build_huffman_table(const unsigned char *bits, const unsigned char *vals, struct huffman_table *table) +{ + unsigned int i, j, code, code_size, val, nbits; + unsigned char huffsize[HUFFMAN_BITS_SIZE+1], *hz; + unsigned int huffcode[HUFFMAN_BITS_SIZE+1], *hc; + int next_free_entry; + + /* + * Build a temp array + * huffsize[X] => numbers of bits to write vals[X] + */ + hz = huffsize; + for (i=1; i<=16; i++) + { + for (j=1; j<=bits[i]; j++) + *hz++ = i; + } + *hz = 0; + + memset(table->lookup, 0xff, sizeof(table->lookup)); + for (i=0; i<(16-HUFFMAN_HASH_NBITS); i++) + table->slowtable[i][0] = 0; + + /* Build a temp array + * huffcode[X] => code used to write vals[X] + */ + code = 0; + hc = huffcode; + hz = huffsize; + nbits = *hz; + while (*hz) + { + while (*hz == nbits) + { + *hc++ = code++; + hz++; + } + code <<= 1; + nbits++; + } + + /* + * Build the lookup table, and the slowtable if needed. + */ + next_free_entry = -1; + for (i=0; huffsize[i]; i++) + { + val = vals[i]; + code = huffcode[i]; + code_size = huffsize[i]; + + //trace("val=%2.2x code=%8.8x codesize=%2.2d\n", val, code, code_size); + + table->code_size[val] = code_size; + if (code_size <= HUFFMAN_HASH_NBITS) + { + /* + * Good: val can be put in the lookup table, so fill all value of this + * column with value val + */ + int repeat = 1UL<<(HUFFMAN_HASH_NBITS - code_size); + code <<= HUFFMAN_HASH_NBITS - code_size; + while ( repeat-- ) + table->lookup[code++] = val; + + } + else + { + /* Perhaps sorting the array will be an optimization */ + uint16_t *slowtable = table->slowtable[code_size-HUFFMAN_HASH_NBITS-1]; + while(slowtable[0]) + slowtable+=2; + slowtable[0] = code; + slowtable[1] = val; + slowtable[2] = 0; + /* TODO: NEED TO CHECK FOR AN OVERFLOW OF THE TABLE */ + } + + } +} + +static void build_default_huffman_tables(struct jdec_private *priv) +{ + if ( (priv->flags & TINYJPEG_FLAGS_MJPEG_TABLE) + && priv->default_huffman_table_initialized) + return; + + build_huffman_table(bits_dc_luminance, val_dc_luminance, &priv->HTDC[0]); + build_huffman_table(bits_ac_luminance, val_ac_luminance, &priv->HTAC[0]); + + build_huffman_table(bits_dc_chrominance, val_dc_chrominance, &priv->HTDC[1]); + build_huffman_table(bits_ac_chrominance, val_ac_chrominance, &priv->HTAC[1]); + + priv->default_huffman_table_initialized = 1; +} + + + +/******************************************************************************* +* +* Colorspace conversion routine +* +* +* Note: +* YCbCr is defined per CCIR 601-1, except that Cb and Cr are +* normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. +* The conversion equations to be implemented are therefore +* R = Y + 1.40200 * Cr +* G = Y - 0.34414 * Cb - 0.71414 * Cr +* B = Y + 1.77200 * Cb +* +******************************************************************************/ + +static unsigned char clamp(int i) +{ + if (i<0) + return 0; + else if (i>255) + return 255; + else + return i; +} + + +/** +* YCrCb -> YUV420P (1x1) +* .---. +* | 1 | +* `---' +*/ +static void YCrCB_to_YUV420P_1x1(struct jdec_private *priv) +{ + const unsigned char *s, *y; + unsigned char *p; + int i,j; + + p = priv->plane[0]; + y = priv->Y; + for (i=0; i<8; i++) + { + memcpy(p, y, 8); + p+=priv->width; + y+=8; + } + + p = priv->plane[1]; + s = priv->Cb; + for (i=0; i<8; i+=2) + { + for (j=0; j<8; j+=2, s+=2) + *p++ = *s; + s += 8; /* Skip one line */ + p += priv->width/2 - 4; + } + + p = priv->plane[2]; + s = priv->Cr; + for (i=0; i<8; i+=2) + { + for (j=0; j<8; j+=2, s+=2) + *p++ = *s; + s += 8; /* Skip one line */ + p += priv->width/2 - 4; + } +} + +/** +* YCrCb -> YUV420P (2x1) +* .-------. +* | 1 | 2 | +* `-------' +*/ +static void YCrCB_to_YUV420P_2x1(struct jdec_private *priv) +{ + unsigned char *p; + const unsigned char *s, *y1; + unsigned int i; + + p = priv->plane[0]; + y1 = priv->Y; + for (i=0; i<8; i++) + { + memcpy(p, y1, 16); + p += priv->width; + y1 += 16; + } + + p = priv->plane[1]; + s = priv->Cb; + for (i=0; i<8; i+=2) + { + memcpy(p, s, 8); + s += 16; /* Skip one line */ + p += priv->width/2; + } + + p = priv->plane[2]; + s = priv->Cr; + for (i=0; i<8; i+=2) + { + memcpy(p, s, 8); + s += 16; /* Skip one line */ + p += priv->width/2; + } +} + + +/** +* YCrCb -> YUV420P (1x2) +* .---. +* | 1 | +* |---| +* | 2 | +* `---' +*/ +static void YCrCB_to_YUV420P_1x2(struct jdec_private *priv) +{ + const unsigned char *s, *y; + unsigned char *p; + int i,j; + + p = priv->plane[0]; + y = priv->Y; + for (i=0; i<16; i++) + { + memcpy(p, y, 8); + p+=priv->width; + y+=8; + } + + p = priv->plane[1]; + s = priv->Cb; + for (i=0; i<8; i++) + { + for (j=0; j<8; j+=2, s+=2) + *p++ = *s; + p += priv->width/2 - 4; + } + + p = priv->plane[2]; + s = priv->Cr; + for (i=0; i<8; i++) + { + for (j=0; j<8; j+=2, s+=2) + *p++ = *s; + p += priv->width/2 - 4; + } +} + +/** +* YCrCb -> YUV420P (2x2) +* .-------. +* | 1 | 2 | +* |---+---| +* | 3 | 4 | +* `-------' +*/ +static void YCrCB_to_YUV420P_2x2(struct jdec_private *priv) +{ + unsigned char *p; + const unsigned char *s, *y1; + unsigned int i; + + p = priv->plane[0]; + y1 = priv->Y; + for (i=0; i<16; i++) + { + memcpy(p, y1, 16); + p += priv->width; + y1 += 16; + } + + p = priv->plane[1]; + s = priv->Cb; + for (i=0; i<8; i++) + { + memcpy(p, s, 8); + s += 8; + p += priv->width/2; + } + + p = priv->plane[2]; + s = priv->Cr; + for (i=0; i<8; i++) + { + memcpy(p, s, 8); + s += 8; + p += priv->width/2; + } +} + +/** +* YCrCb -> RGB24 (1x1) +* .---. +* | 1 | +* `---' +*/ +static void YCrCB_to_RGB24_1x1(struct jdec_private *priv) +{ + const unsigned char *Y, *Cb, *Cr; + unsigned char *p; + int i,j; + int offset_to_next_row; + +#define SCALEBITS 10 +#define ONE_HALF (1UL << (SCALEBITS-1)) +#define FIX(x) ((int)((x) * (1UL<<SCALEBITS) + 0.5)) + + p = priv->plane[0]; + Y = priv->Y; + Cb = priv->Cb; + Cr = priv->Cr; + offset_to_next_row = priv->width*3 - 8*3; + for (i=0; i<8; i++) { + + for (j=0; j<8; j++) { + + int y, cb, cr; + int add_r, add_g, add_b; + int r, g , b; + + y = (*Y++) << SCALEBITS; + cb = *Cb++ - 128; + cr = *Cr++ - 128; + add_r = FIX(1.40200) * cr + ONE_HALF; + add_g = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF; + add_b = FIX(1.77200) * cb + ONE_HALF; + + r = (y + add_r) >> SCALEBITS; + *p++ = clamp(r); + g = (y + add_g) >> SCALEBITS; + *p++ = clamp(g); + b = (y + add_b) >> SCALEBITS; + *p++ = clamp(b); + + } + + p += offset_to_next_row; + } + +#undef SCALEBITS +#undef ONE_HALF +#undef FIX + +} + +/** +* YCrCb -> BGR24 (1x1) +* .---. +* | 1 | +* `---' +*/ +static void YCrCB_to_BGR24_1x1(struct jdec_private *priv) +{ + const unsigned char *Y, *Cb, *Cr; + unsigned char *p; + int i,j; + int offset_to_next_row; + +#define SCALEBITS 10 +#define ONE_HALF (1UL << (SCALEBITS-1)) +#define FIX(x) ((int)((x) * (1UL<<SCALEBITS) + 0.5)) + + p = priv->plane[0]; + Y = priv->Y; + Cb = priv->Cb; + Cr = priv->Cr; + offset_to_next_row = priv->width*3 - 8*3; + for (i=0; i<8; i++) { + + for (j=0; j<8; j++) { + + int y, cb, cr; + int add_r, add_g, add_b; + int r, g , b; + + y = (*Y++) << SCALEBITS; + cb = *Cb++ - 128; + cr = *Cr++ - 128; + add_r = FIX(1.40200) * cr + ONE_HALF; + add_g = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF; + add_b = FIX(1.77200) * cb + ONE_HALF; + + b = (y + add_b) >> SCALEBITS; + *p++ = clamp(b); + g = (y + add_g) >> SCALEBITS; + *p++ = clamp(g); + r = (y + add_r) >> SCALEBITS; + *p++ = clamp(r); + + } + + p += offset_to_next_row; + } + +#undef SCALEBITS +#undef ONE_HALF +#undef FIX + +} + + +/** +* YCrCb -> RGB24 (2x1) +* .-------. +* | 1 | 2 | +* `-------' +*/ +static void YCrCB_to_RGB24_2x1(struct jdec_private *priv) +{ + const unsigned char *Y, *Cb, *Cr; + unsigned char *p; + int i,j; + int offset_to_next_row; + +#define SCALEBITS 10 +#define ONE_HALF (1UL << (SCALEBITS-1)) +#define FIX(x) ((int)((x) * (1UL<<SCALEBITS) + 0.5)) + + p = priv->plane[0]; + Y = priv->Y; + Cb = priv->Cb; + Cr = priv->Cr; + offset_to_next_row = priv->width*3 - 16*3; + for (i=0; i<8; i++) { + + for (j=0; j<8; j++) { + + int y, cb, cr; + int add_r, add_g, add_b; + int r, g , b; + + y = (*Y++) << SCALEBITS; + cb = *Cb++ - 128; + cr = *Cr++ - 128; + add_r = FIX(1.40200) * cr + ONE_HALF; + add_g = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF; + add_b = FIX(1.77200) * cb + ONE_HALF; + + r = (y + add_r) >> SCALEBITS; + *p++ = clamp(r); + g = (y + add_g) >> SCALEBITS; + *p++ = clamp(g); + b = (y + add_b) >> SCALEBITS; + *p++ = clamp(b); + + y = (*Y++) << SCALEBITS; + r = (y + add_r) >> SCALEBITS; + *p++ = clamp(r); + g = (y + add_g) >> SCALEBITS; + *p++ = clamp(g); + b = (y + add_b) >> SCALEBITS; + *p++ = clamp(b); + + } + + p += offset_to_next_row; + } + +#undef SCALEBITS +#undef ONE_HALF +#undef FIX + +} + +/* +* YCrCb -> BGR24 (2x1) +* .-------. +* | 1 | 2 | +* `-------' +*/ +static void YCrCB_to_BGR24_2x1(struct jdec_private *priv) +{ + const unsigned char *Y, *Cb, *Cr; + unsigned char *p; + int i,j; + int offset_to_next_row; + +#define SCALEBITS 10 +#define ONE_HALF (1UL << (SCALEBITS-1)) +#define FIX(x) ((int)((x) * (1UL<<SCALEBITS) + 0.5)) + + p = priv->plane[0]; + Y = priv->Y; + Cb = priv->Cb; + Cr = priv->Cr; + offset_to_next_row = priv->width*3 - 16*3; + for (i=0; i<8; i++) { + + for (j=0; j<8; j++) { + + int y, cb, cr; + int add_r, add_g, add_b; + int r, g , b; + + cb = *Cb++ - 128; + cr = *Cr++ - 128; + add_r = FIX(1.40200) * cr + ONE_HALF; + add_g = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF; + add_b = FIX(1.77200) * cb + ONE_HALF; + + y = (*Y++) << SCALEBITS; + b = (y + add_b) >> SCALEBITS; + *p++ = clamp(b); + g = (y + add_g) >> SCALEBITS; + *p++ = clamp(g); + r = (y + add_r) >> SCALEBITS; + *p++ = clamp(r); + + y = (*Y++) << SCALEBITS; + b = (y + add_b) >> SCALEBITS; + *p++ = clamp(b); + g = (y + add_g) >> SCALEBITS; + *p++ = clamp(g); + r = (y + add_r) >> SCALEBITS; + *p++ = clamp(r); + + } + + p += offset_to_next_row; + } + +#undef SCALEBITS +#undef ONE_HALF +#undef FIX + +} + +/** +* YCrCb -> RGB24 (1x2) +* .---. +* | 1 | +* |---| +* | 2 | +* `---' +*/ +static void YCrCB_to_RGB24_1x2(struct jdec_private *priv) +{ + const unsigned char *Y, *Cb, *Cr; + unsigned char *p, *p2; + int i,j; + int offset_to_next_row; + +#define SCALEBITS 10 +#define ONE_HALF (1UL << (SCALEBITS-1)) +#define FIX(x) ((int)((x) * (1UL<<SCALEBITS) + 0.5)) + + p = priv->plane[0]; + p2 = priv->plane[0] + priv->width*3; + Y = priv->Y; + Cb = priv->Cb; + Cr = priv->Cr; + offset_to_next_row = 2*priv->width*3 - 8*3; + for (i=0; i<8; i++) { + + for (j=0; j<8; j++) { + + int y, cb, cr; + int add_r, add_g, add_b; + int r, g , b; + + cb = *Cb++ - 128; + cr = *Cr++ - 128; + add_r = FIX(1.40200) * cr + ONE_HALF; + add_g = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF; + add_b = FIX(1.77200) * cb + ONE_HALF; + + y = (*Y++) << SCALEBITS; + r = (y + add_r) >> SCALEBITS; + *p++ = clamp(r); + g = (y + add_g) >> SCALEBITS; + *p++ = clamp(g); + b = (y + add_b) >> SCALEBITS; + *p++ = clamp(b); + + y = (Y[8-1]) << SCALEBITS; + r = (y + add_r) >> SCALEBITS; + *p2++ = clamp(r); + g = (y + add_g) >> SCALEBITS; + *p2++ = clamp(g); + b = (y + add_b) >> SCALEBITS; + *p2++ = clamp(b); + + } + Y += 8; + p += offset_to_next_row; + p2 += offset_to_next_row; + } + +#undef SCALEBITS +#undef ONE_HALF +#undef FIX + +} + +/* +* YCrCb -> BGR24 (1x2) +* .---. +* | 1 | +* |---| +* | 2 | +* `---' +*/ +static void YCrCB_to_BGR24_1x2(struct jdec_private *priv) +{ + const unsigned char *Y, *Cb, *Cr; + unsigned char *p, *p2; + int i,j; + int offset_to_next_row; + +#define SCALEBITS 10 +#define ONE_HALF (1UL << (SCALEBITS-1)) +#define FIX(x) ((int)((x) * (1UL<<SCALEBITS) + 0.5)) + + p = priv->plane[0]; + p2 = priv->plane[0] + priv->width*3; + Y = priv->Y; + Cb = priv->Cb; + Cr = priv->Cr; + offset_to_next_row = 2*priv->width*3 - 8*3; + for (i=0; i<8; i++) { + + for (j=0; j<8; j++) { + + int y, cb, cr; + int add_r, add_g, add_b; + int r, g , b; + + cb = *Cb++ - 128; + cr = *Cr++ - 128; + add_r = FIX(1.40200) * cr + ONE_HALF; + add_g = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF; + add_b = FIX(1.77200) * cb + ONE_HALF; + + y = (*Y++) << SCALEBITS; + b = (y + add_b) >> SCALEBITS; + *p++ = clamp(b); + g = (y + add_g) >> SCALEBITS; + *p++ = clamp(g); + r = (y + add_r) >> SCALEBITS; + *p++ = clamp(r); + + y = (Y[8-1]) << SCALEBITS; + b = (y + add_b) >> SCALEBITS; + *p2++ = clamp(b); + g = (y + add_g) >> SCALEBITS; + *p2++ = clamp(g); + r = (y + add_r) >> SCALEBITS; + *p2++ = clamp(r); + + } + Y += 8; + p += offset_to_next_row; + p2 += offset_to_next_row; + } + +#undef SCALEBITS +#undef ONE_HALF +#undef FIX + +} + + +/** +* YCrCb -> RGB24 (2x2) +* .-------. +* | 1 | 2 | +* |---+---| +* | 3 | 4 | +* `-------' +*/ +static void YCrCB_to_RGB24_2x2(struct jdec_private *priv) +{ + const unsigned char *Y, *Cb, *Cr; + unsigned char *p, *p2; + int i,j; + int offset_to_next_row; + +#define SCALEBITS 10 +#define ONE_HALF (1UL << (SCALEBITS-1)) +#define FIX(x) ((int)((x) * (1UL<<SCALEBITS) + 0.5)) + + p = priv->plane[0]; + p2 = priv->plane[0] + priv->width*3; + Y = priv->Y; + Cb = priv->Cb; + Cr = priv->Cr; + offset_to_next_row = (priv->width*3*2) - 16*3; + for (i=0; i<8; i++) { + + for (j=0; j<8; j++) { + + int y, cb, cr; + int add_r, add_g, add_b; + int r, g , b; + + cb = *Cb++ - 128; + cr = *Cr++ - 128; + add_r = FIX(1.40200) * cr + ONE_HALF; + add_g = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF; + add_b = FIX(1.77200) * cb + ONE_HALF; + + y = (*Y++) << SCALEBITS; + r = (y + add_r) >> SCALEBITS; + *p++ = clamp(r); + g = (y + add_g) >> SCALEBITS; + *p++ = clamp(g); + b = (y + add_b) >> SCALEBITS; + *p++ = clamp(b); + + y = (*Y++) << SCALEBITS; + r = (y + add_r) >> SCALEBITS; + *p++ = clamp(r); + g = (y + add_g) >> SCALEBITS; + *p++ = clamp(g); + b = (y + add_b) >> SCALEBITS; + *p++ = clamp(b); + + y = (Y[16-2]) << SCALEBITS; + r = (y + add_r) >> SCALEBITS; + *p2++ = clamp(r); + g = (y + add_g) >> SCALEBITS; + *p2++ = clamp(g); + b = (y + add_b) >> SCALEBITS; + *p2++ = clamp(b); + + y = (Y[16-1]) << SCALEBITS; + r = (y + add_r) >> SCALEBITS; + *p2++ = clamp(r); + g = (y + add_g) >> SCALEBITS; + *p2++ = clamp(g); + b = (y + add_b) >> SCALEBITS; + *p2++ = clamp(b); + } + Y += 16; + p += offset_to_next_row; + p2 += offset_to_next_row; + } + +#undef SCALEBITS +#undef ONE_HALF +#undef FIX + +} + + +/* +* YCrCb -> BGR24 (2x2) +* .-------. +* | 1 | 2 | +* |---+---| +* | 3 | 4 | +* `-------' +*/ +static void YCrCB_to_BGR24_2x2(struct jdec_private *priv) +{ + const unsigned char *Y, *Cb, *Cr; + unsigned char *p, *p2; + int i,j; + int offset_to_next_row; + +#define SCALEBITS 10 +#define ONE_HALF (1UL << (SCALEBITS-1)) +#define FIX(x) ((int)((x) * (1UL<<SCALEBITS) + 0.5)) + + p = priv->plane[0]; + p2 = priv->plane[0] + priv->width*3; + Y = priv->Y; + Cb = priv->Cb; + Cr = priv->Cr; + offset_to_next_row = (priv->width*3*2) - 16*3; + for (i=0; i<8; i++) { + + for (j=0; j<8; j++) { + + int y, cb, cr; + int add_r, add_g, add_b; + int r, g , b; + + cb = *Cb++ - 128; + cr = *Cr++ - 128; + add_r = FIX(1.40200) * cr + ONE_HALF; + add_g = - FIX(0.34414) * cb - FIX(0.71414) * cr + ONE_HALF; + add_b = FIX(1.77200) * cb + ONE_HALF; + + y = (*Y++) << SCALEBITS; + b = (y + add_b) >> SCALEBITS; + *p++ = clamp(b); + g = (y + add_g) >> SCALEBITS; + *p++ = clamp(g); + r = (y + add_r) >> SCALEBITS; + *p++ = clamp(r); + + y = (*Y++) << SCALEBITS; + b = (y + add_b) >> SCALEBITS; + *p++ = clamp(b); + g = (y + add_g) >> SCALEBITS; + *p++ = clamp(g); + r = (y + add_r) >> SCALEBITS; + *p++ = clamp(r); + + y = (Y[16-2]) << SCALEBITS; + b = (y + add_b) >> SCALEBITS; + *p2++ = clamp(b); + g = (y + add_g) >> SCALEBITS; + *p2++ = clamp(g); + r = (y + add_r) >> SCALEBITS; + *p2++ = clamp(r); + + y = (Y[16-1]) << SCALEBITS; + b = (y + add_b) >> SCALEBITS; + *p2++ = clamp(b); + g = (y + add_g) >> SCALEBITS; + *p2++ = clamp(g); + r = (y + add_r) >> SCALEBITS; + *p2++ = clamp(r); + } + Y += 16; + p += offset_to_next_row; + p2 += offset_to_next_row; + } + +#undef SCALEBITS +#undef ONE_HALF +#undef FIX + +} + + + +/** +* YCrCb -> Grey (1x1) +* .---. +* | 1 | +* `---' +*/ +static void YCrCB_to_Grey_1x1(struct jdec_private *priv) +{ + const unsigned char *y; + unsigned char *p; + unsigned int i; + int offset_to_next_row; + + p = priv->plane[0]; + y = priv->Y; + offset_to_next_row = priv->width; + + for (i=0; i<8; i++) { + memcpy(p, y, 8); + y+=8; + p += offset_to_next_row; + } +} + +/** +* YCrCb -> Grey (2x1) +* .-------. +* | 1 | 2 | +* `-------' +*/ +static void YCrCB_to_Grey_2x1(struct jdec_private *priv) +{ + const unsigned char *y; + unsigned char *p; + unsigned int i; + + p = priv->plane[0]; + y = priv->Y; + + for (i=0; i<8; i++) { + memcpy(p, y, 16); + y += 16; + p += priv->width; + } +} + + +/** +* YCrCb -> Grey (1x2) +* .---. +* | 1 | +* |---| +* | 2 | +* `---' +*/ +static void YCrCB_to_Grey_1x2(struct jdec_private *priv) +{ + const unsigned char *y; + unsigned char *p; + unsigned int i; + + p = priv->plane[0]; + y = priv->Y; + + for (i=0; i<16; i++) { + memcpy(p, y, 8); + y += 8; + p += priv->width; + } +} + +/** +* YCrCb -> Grey (2x2) +* .-------. +* | 1 | 2 | +* |---+---| +* | 3 | 4 | +* `-------' +*/ +static void YCrCB_to_Grey_2x2(struct jdec_private *priv) +{ + const unsigned char *y; + unsigned char *p; + unsigned int i; + + p = priv->plane[0]; + y = priv->Y; + + for (i=0; i<16; i++) { + memcpy(p, y, 16); + y += 16; + p += priv->width; + } +} + + +/* +* Decode all the 3 components for 1x1 +*/ +static void decode_MCU_1x1_3planes(struct jdec_private *priv) +{ + // Y + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y, 8); + + // Cb + process_Huffman_data_unit(priv, cCb); + IDCT(&priv->component_infos[cCb], priv->Cb, 8); + + // Cr + process_Huffman_data_unit(priv, cCr); + IDCT(&priv->component_infos[cCr], priv->Cr, 8); +} + +/* +* Decode a 1x1 directly in 1 color +*/ +static void decode_MCU_1x1_1plane(struct jdec_private *priv) +{ + // Y + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y, 8); + + // Cb + process_Huffman_data_unit(priv, cCb); + IDCT(&priv->component_infos[cCb], priv->Cb, 8); + + // Cr + process_Huffman_data_unit(priv, cCr); + IDCT(&priv->component_infos[cCr], priv->Cr, 8); +} + + +/* +* Decode a 2x1 +* .-------. +* | 1 | 2 | +* `-------' +*/ +static void decode_MCU_2x1_3planes(struct jdec_private *priv) +{ + // Y + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y, 16); + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y+8, 16); + + // Cb + process_Huffman_data_unit(priv, cCb); + IDCT(&priv->component_infos[cCb], priv->Cb, 8); + + // Cr + process_Huffman_data_unit(priv, cCr); + IDCT(&priv->component_infos[cCr], priv->Cr, 8); +} + +/* +* Decode a 2x1 +* .-------. +* | 1 | 2 | +* `-------' +*/ +static void decode_MCU_2x1_1plane(struct jdec_private *priv) +{ + // Y + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y, 16); + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y+8, 16); + + // Cb + process_Huffman_data_unit(priv, cCb); + + // Cr + process_Huffman_data_unit(priv, cCr); +} + + +/* +* Decode a 2x2 +* .-------. +* | 1 | 2 | +* |---+---| +* | 3 | 4 | +* `-------' +*/ +static void decode_MCU_2x2_3planes(struct jdec_private *priv) +{ + // Y + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y, 16); + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y+8, 16); + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y+64*2, 16); + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y+64*2+8, 16); + + // Cb + process_Huffman_data_unit(priv, cCb); + IDCT(&priv->component_infos[cCb], priv->Cb, 8); + + // Cr + process_Huffman_data_unit(priv, cCr); + IDCT(&priv->component_infos[cCr], priv->Cr, 8); +} + +/* +* Decode a 2x2 directly in GREY format (8bits) +* .-------. +* | 1 | 2 | +* |---+---| +* | 3 | 4 | +* `-------' +*/ +static void decode_MCU_2x2_1plane(struct jdec_private *priv) +{ + // Y + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y, 16); + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y+8, 16); + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y+64*2, 16); + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y+64*2+8, 16); + + // Cb + process_Huffman_data_unit(priv, cCb); + + // Cr + process_Huffman_data_unit(priv, cCr); +} + +/* +* Decode a 1x2 mcu +* .---. +* | 1 | +* |---| +* | 2 | +* `---' +*/ +static void decode_MCU_1x2_3planes(struct jdec_private *priv) +{ + // Y + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y, 8); + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y+64, 8); + + // Cb + process_Huffman_data_unit(priv, cCb); + IDCT(&priv->component_infos[cCb], priv->Cb, 8); + + // Cr + process_Huffman_data_unit(priv, cCr); + IDCT(&priv->component_infos[cCr], priv->Cr, 8); +} + +/* +* Decode a 1x2 mcu +* .---. +* | 1 | +* |---| +* | 2 | +* `---' +*/ +static void decode_MCU_1x2_1plane(struct jdec_private *priv) +{ + // Y + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y, 8); + process_Huffman_data_unit(priv, cY); + IDCT(&priv->component_infos[cY], priv->Y+64, 8); + + // Cb + process_Huffman_data_unit(priv, cCb); + + // Cr + process_Huffman_data_unit(priv, cCr); +} + +static void print_SOF(const unsigned char *stream) +{ + int width, height, nr_components, precision; +#if DEBUG + const char *nr_components_to_string[] = { + "????", + "Grayscale", + "????", + "YCbCr", + "CYMK" + }; +#endif + + precision = stream[2]; + height = be16_to_cpu(stream+3); + width = be16_to_cpu(stream+5); + nr_components = stream[7]; + + /*trace("> SOF marker\n"); + trace("Size:%dx%d nr_components:%d (%s) precision:%d\n", + width, height, + nr_components, nr_components_to_string[nr_components], + precision);*/ +} + +/******************************************************************************* +* +* JPEG/JFIF Parsing functions +* +* Note: only a small subset of the jpeg file format is supported. No markers, +* nor progressive stream is supported. +* +******************************************************************************/ + +static void build_quantization_table(int *qtable, const unsigned char *ref_table) +{ + /* Taken from libjpeg. Copyright Independent JPEG Group's LLM idct. + * For float AA&N IDCT method, divisors are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * We apply a further scale factor of 8. + * What's actually stored is 1/divisor so that the inner loop can + * use a multiplication rather than a division. + */ + int i, j; + /*static const double aanscalefactor[8] = { + 1.0, 1.387039845, 1.306562965, 1.175875602, + 1.0, 0.785694958, 0.541196100, 0.275899379 + };*/ + static const int aanscalefactor[8] = { + DCT_FIX(1.0), DCT_FIX(1.387039845), DCT_FIX(1.306562965), DCT_FIX(1.175875602), + DCT_FIX(1.0), DCT_FIX(0.785694958), DCT_FIX(0.541196100), DCT_FIX(0.275899379) + }; + const unsigned char *zz = zigzag; + + for (i=0; i<8; i++) { + for (j=0; j<8; j++) { + //*qtable++ = (float)(ref_table[*zz++] * aanscalefactor[i] * aanscalefactor[j]); + //float f = (float)(ref_table[*zz++] * aanscalefactor[i] * aanscalefactor[j]); + int value = ref_table[*zz++]; + value *= aanscalefactor[i]; + value *= aanscalefactor[j]; + *qtable++ = DCT_DESCALE1(value); + } + } + +} + +static int parse_DQT(struct jdec_private *priv, const unsigned char *stream) +{ + int qi; + int *table; + const unsigned char *dqt_block_end; + + //trace("> DQT marker\n"); + dqt_block_end = stream + be16_to_cpu(stream); + stream += 2; /* Skip length */ + + while (stream < dqt_block_end) + { + qi = *stream++; +#if SANITY_CHECK + if (qi>>4) { + //error("16 bits quantization table is not supported\n"); + snprintf(error_string, sizeof(error_string), "16 bits quantization table is not supported\n"); + return -1; + } + if (qi>4) { + //error("No more 4 quantization table is supported (got %d)\n", qi); + snprintf(error_string, sizeof(error_string), "No more 4 quantization table is supported (got %d)\n", qi); + return -1; + } +#endif + table = priv->Q_tables[qi]; + build_quantization_table(table, stream); + stream += 64; + } + //trace("< DQT marker\n"); + return 0; +} + +static int parse_SOF(struct jdec_private *priv, const unsigned char *stream) +{ + int i, width, height, nr_components, cid, sampling_factor; + int Q_table; + struct component *c; + + // trace("> SOF marker\n"); + print_SOF(stream); + + height = be16_to_cpu(stream+3); + width = be16_to_cpu(stream+5); + nr_components = stream[7]; +#if SANITY_CHECK + if (stream[2] != 8) { + error0("Precision other than 8 is not supported\n"); + } + if (width>JPEG_MAX_WIDTH || height>JPEG_MAX_HEIGHT) + error2("Width and Height (%dx%d) seems suspicious\n", width, height); + if (nr_components != 3) + error0("We only support YUV images\n"); + if (height%16) + error1("Height need to be a multiple of 16 (current height is %d)\n", height); + if (width%16) + error1("Width need to be a multiple of 16 (current Width is %d)\n", width); +#endif + stream += 8; + for (i=0; i<nr_components; i++) { + cid = *stream++; + sampling_factor = *stream++; + Q_table = *stream++; + c = &priv->component_infos[i]; +#if SANITY_CHECK + c->cid = cid; + if (Q_table >= COMPONENTS) + error2("Bad Quantization table index (got %d, max allowed %d)\n", Q_table, COMPONENTS-1); +#endif + c->Vfactor = sampling_factor&0xf; + c->Hfactor = sampling_factor>>4; + c->Q_table = priv->Q_tables[Q_table]; + //trace("Component:%d factor:%dx%d Quantization table:%d\n", + // cid, c->Hfactor, c->Hfactor, Q_table ); + + } + priv->width = width; + priv->height = height; + + //trace("< SOF marker\n"); + + return 0; +} + +static int parse_SOS(struct jdec_private *priv, const unsigned char *stream) +{ + unsigned int i, cid, table; + unsigned int nr_components = stream[2]; + + // trace("> SOS marker\n"); + +#if SANITY_CHECK + if (nr_components != 3) + error0("We only support YCbCr image\n"); +#endif + + stream += 3; + for (i=0;i<nr_components;i++) { + cid = *stream++; + table = *stream++; +#if SANITY_CHECK + if ((table&0xf)>=4) + error0("We do not support more than 2 AC Huffman table\n"); + if ((table>>4)>=4) + error0("We do not support more than 2 DC Huffman table\n"); + if (cid != priv->component_infos[i].cid) + error4("SOS cid order (%d:%d) isn't compatible with the SOF marker (%d:%d)\n", + i, cid, i, priv->component_infos[i].cid); + //trace("ComponentId:%d tableAC:%d tableDC:%d\n", cid, table&0xf, table>>4); +#endif + priv->component_infos[i].AC_table = &priv->HTAC[table&0xf]; + priv->component_infos[i].DC_table = &priv->HTDC[table>>4]; + } + priv->stream = stream+3; + //trace("< SOS marker\n"); + return 0; +} + +static int parse_DHT(struct jdec_private *priv, const unsigned char *stream) +{ + unsigned int count, i; + unsigned char huff_bits[17]; + int length, index; + + length = be16_to_cpu(stream) - 2; + stream += 2; /* Skip length */ + + // trace("> DHT marker (length=%d)\n", length); + + while (length>0) { + index = *stream++; + + /* We need to calculate the number of bytes 'vals' will takes */ + huff_bits[0] = 0; + count = 0; + for (i=1; i<17; i++) { + huff_bits[i] = *stream++; + count += huff_bits[i]; + } +#if SANITY_CHECK + if (count >= HUFFMAN_BITS_SIZE) + error1("No more than %d bytes is allowed to describe a huffman table", HUFFMAN_BITS_SIZE); + if ( (index &0xf) >= HUFFMAN_TABLES) + error2("No more than %d Huffman tables is supported (got %d)\n", HUFFMAN_TABLES, index&0xf); + //trace("Huffman table %s[%d] length=%d\n", (index&0xf0)?"AC":"DC", index&0xf, count); +#endif + + if (index & 0xf0 ) + build_huffman_table(huff_bits, stream, &priv->HTAC[index&0xf]); + else + build_huffman_table(huff_bits, stream, &priv->HTDC[index&0xf]); + + length -= 1; + length -= 16; + length -= count; + stream += count; + } + //trace("< DHT marker\n"); + return 0; +} + +static int parse_DRI(struct jdec_private *priv, const unsigned char *stream) +{ + unsigned int length; + + // trace("> DRI marker\n"); + + length = be16_to_cpu(stream); + +#if SANITY_CHECK + if (length != 4) + error0("Length of DRI marker need to be 4\n"); +#endif + + priv->restart_interval = be16_to_cpu(stream+2); + +#if DEBUG + trace("Restart interval = %d\n", priv->restart_interval); +#endif + + //trace("< DRI marker\n"); + + return 0; +} + + + +static void resync(struct jdec_private *priv) +{ + int i; + + /* Init DC coefficients */ + for (i=0; i<COMPONENTS; i++) + priv->component_infos[i].previous_DC = 0; + + priv->reservoir = 0; + priv->nbits_in_reservoir = 0; + if (priv->restart_interval > 0) + priv->restarts_to_go = priv->restart_interval; + else + priv->restarts_to_go = -1; +} + +static int find_next_rst_marker(struct jdec_private *priv) +{ + int rst_marker_found = 0; + int marker; + const unsigned char *stream = priv->stream; + + /* Parse marker */ + while (!rst_marker_found) + { + while (*stream++ != 0xff) + { + if (stream >= priv->stream_end) + error0("EOF while search for a RST marker."); + } + /* Skip any padding ff byte (this is normal) */ + while (*stream == 0xff) + stream++; + + marker = *stream++; + if ((RST+priv->last_rst_marker_seen) == marker) + rst_marker_found = 1; + else if (marker >= RST && marker <= RST7) + error0("Wrong Reset marker found, aborting"); + else if (marker == EOI) + return 0; + } + // trace("RST Marker %d found at offset %d\n", priv->last_rst_marker_seen, stream - priv->stream_begin); + + priv->stream = stream; + priv->last_rst_marker_seen++; + priv->last_rst_marker_seen &= 7; + + return 0; +} + +static int parse_JFIF(struct jdec_private *priv, const unsigned char *stream) +{ + int chuck_len; + int marker; + int sos_marker_found = 0; + int dht_marker_found = 0; + const unsigned char *next_chunck; + + /* Parse marker */ + while (!sos_marker_found) + { + if (*stream++ != 0xff) + goto bogus_jpeg_format; + /* Skip any padding ff byte (this is normal) */ + while (*stream == 0xff) + stream++; + + marker = *stream++; + chuck_len = be16_to_cpu(stream); + next_chunck = stream + chuck_len; + switch (marker) + { + case SOF: + if (parse_SOF(priv, stream) < 0) + return -1; + break; + case DQT: + if (parse_DQT(priv, stream) < 0) + return -1; + break; + case SOS: + if (parse_SOS(priv, stream) < 0) + return -1; + sos_marker_found = 1; + break; + case DHT: + if (parse_DHT(priv, stream) < 0) + return -1; + dht_marker_found = 1; + break; + case DRI: + if (parse_DRI(priv, stream) < 0) + return -1; + break; + default: + // trace("> Unknown marker %2.2x\n", marker); + break; + } + + stream = next_chunck; + } + + if (!dht_marker_found) { + //trace("No Huffman table loaded, using the default one\n"); + build_default_huffman_tables(priv); + } + +#ifdef SANITY_CHECK + if ( (priv->component_infos[cY].Hfactor < priv->component_infos[cCb].Hfactor) + || (priv->component_infos[cY].Hfactor < priv->component_infos[cCr].Hfactor)) + error0("Horizontal sampling factor for Y should be greater than horitontal sampling factor for Cb or Cr\n"); + if ( (priv->component_infos[cY].Vfactor < priv->component_infos[cCb].Vfactor) + || (priv->component_infos[cY].Vfactor < priv->component_infos[cCr].Vfactor)) + error0("Vertical sampling factor for Y should be greater than vertical sampling factor for Cb or Cr\n"); + if ( (priv->component_infos[cCb].Hfactor!=1) + || (priv->component_infos[cCr].Hfactor!=1) + || (priv->component_infos[cCb].Vfactor!=1) + || (priv->component_infos[cCr].Vfactor!=1)) + error0("Sampling other than 1x1 for Cr and Cb is not supported"); +#endif + + return 0; +bogus_jpeg_format: + //trace("Bogus jpeg format\n"); + return -1; +} + +/******************************************************************************* +* +* Functions exported of the library. +* +* Note: Some applications can access directly to internal pointer of the +* structure. It's is not recommended, but if you have many images to +* uncompress with the same parameters, some functions can be called to speedup +* the decoding. +* +******************************************************************************/ + +/** +* Allocate a new tinyjpeg decoder object. +* +* Before calling any other functions, an object need to be called. +*/ +struct jdec_private *tinyjpeg_init(void) +{ + struct jdec_private *priv; + + priv = (struct jdec_private *)calloc(1, sizeof(struct jdec_private)); + if (priv == NULL) + return NULL; + return priv; +} + +/** +* Free a tinyjpeg object. +* +* No others function can be called after this one. +*/ +void tinyjpeg_free(struct jdec_private *priv) +{ + int i; + for (i=0; i<COMPONENTS; i++) { + if (priv->components[i]) + free(priv->components[i]); + priv->components[i] = NULL; + } + free(priv); +} + +/** +* Initialize the tinyjpeg object and prepare the decoding of the stream. +* +* Check if the jpeg can be decoded with this jpeg decoder. +* Fill some table used for preprocessing. +*/ +int tinyjpeg_parse_header(struct jdec_private *priv, const unsigned char *buf, unsigned int size) +{ + int ret; + + /* Identify the file */ + if ((buf[0] != 0xFF) || (buf[1] != SOI)) + error0("Not a JPG file ?\n"); + + priv->stream_begin = buf+2; + priv->stream_length = size-2; + priv->stream_end = priv->stream_begin + priv->stream_length; + + ret = parse_JFIF(priv, priv->stream_begin); + + return ret; +} + +static const decode_MCU_fct decode_mcu_3comp_table[4] = { + decode_MCU_1x1_3planes, + decode_MCU_1x2_3planes, + decode_MCU_2x1_3planes, + decode_MCU_2x2_3planes, +}; + +static const decode_MCU_fct decode_mcu_1comp_table[4] = { + decode_MCU_1x1_1plane, + decode_MCU_1x2_1plane, + decode_MCU_2x1_1plane, + decode_MCU_2x2_1plane, +}; + +static const convert_colorspace_fct convert_colorspace_yuv420p[4] = { + YCrCB_to_YUV420P_1x1, + YCrCB_to_YUV420P_1x2, + YCrCB_to_YUV420P_2x1, + YCrCB_to_YUV420P_2x2, +}; + +static const convert_colorspace_fct convert_colorspace_rgb24[4] = { + YCrCB_to_RGB24_1x1, + YCrCB_to_RGB24_1x2, + YCrCB_to_RGB24_2x1, + YCrCB_to_RGB24_2x2, +}; + +static const convert_colorspace_fct convert_colorspace_bgr24[4] = { + YCrCB_to_BGR24_1x1, + YCrCB_to_BGR24_1x2, + YCrCB_to_BGR24_2x1, + YCrCB_to_BGR24_2x2, +}; + +static const convert_colorspace_fct convert_colorspace_grey[4] = { + YCrCB_to_Grey_1x1, + YCrCB_to_Grey_1x2, + YCrCB_to_Grey_2x1, + YCrCB_to_Grey_2x2, +}; + +/** +* Decode and convert the jpeg image into @pixfmt@ image +* +* Note: components will be automaticaly allocated if no memory is attached. +*/ +int tinyjpeg_decode(struct jdec_private *priv, int pixfmt) +{ + unsigned int x, y, xstride_by_mcu, ystride_by_mcu; + unsigned int bytes_per_blocklines[3], bytes_per_mcu[3]; + decode_MCU_fct decode_MCU; + const decode_MCU_fct *decode_mcu_table; + const convert_colorspace_fct *colorspace_array_conv; + convert_colorspace_fct convert_to_pixfmt; + + if (setjmp(priv->jump_state)) + return -1; + + /* To keep gcc happy initialize some array */ + bytes_per_mcu[1] = 0; + bytes_per_mcu[2] = 0; + bytes_per_blocklines[1] = 0; + bytes_per_blocklines[2] = 0; + + decode_mcu_table = decode_mcu_3comp_table; + switch (pixfmt) { +case TINYJPEG_FMT_YUV420P: + colorspace_array_conv = convert_colorspace_yuv420p; + if (priv->components[0] == NULL) + priv->components[0] = (uint8_t *)malloc(priv->width * priv->height); + if (priv->components[1] == NULL) + priv->components[1] = (uint8_t *)malloc(priv->width * priv->height/4); + if (priv->components[2] == NULL) + priv->components[2] = (uint8_t *)malloc(priv->width * priv->height/4); + bytes_per_blocklines[0] = priv->width; + bytes_per_blocklines[1] = priv->width/4; + bytes_per_blocklines[2] = priv->width/4; + bytes_per_mcu[0] = 8; + bytes_per_mcu[1] = 4; + bytes_per_mcu[2] = 4; + break; + +case TINYJPEG_FMT_RGB24: + colorspace_array_conv = convert_colorspace_rgb24; + if (priv->components[0] == NULL) + priv->components[0] = (uint8_t *)malloc(priv->width * priv->height * 3); + bytes_per_blocklines[0] = priv->width * 3; + bytes_per_mcu[0] = 3*8; + break; + +case TINYJPEG_FMT_BGR24: + colorspace_array_conv = convert_colorspace_bgr24; + if (priv->components[0] == NULL) + priv->components[0] = (uint8_t *)malloc(priv->width * priv->height * 3); + bytes_per_blocklines[0] = priv->width * 3; + bytes_per_mcu[0] = 3*8; + break; + +case TINYJPEG_FMT_GREY: + decode_mcu_table = decode_mcu_1comp_table; + colorspace_array_conv = convert_colorspace_grey; + if (priv->components[0] == NULL) + priv->components[0] = (uint8_t *)malloc(priv->width * priv->height); + bytes_per_blocklines[0] = priv->width; + bytes_per_mcu[0] = 8; + break; + +default: + // trace("Bad pixel format\n"); + return -1; + } + + xstride_by_mcu = ystride_by_mcu = 8; + if ((priv->component_infos[cY].Hfactor | priv->component_infos[cY].Vfactor) == 1) { + decode_MCU = decode_mcu_table[0]; + convert_to_pixfmt = colorspace_array_conv[0]; + // trace("Use decode 1x1 sampling\n"); + } else if (priv->component_infos[cY].Hfactor == 1) { + decode_MCU = decode_mcu_table[1]; + convert_to_pixfmt = colorspace_array_conv[1]; + ystride_by_mcu = 16; + // trace("Use decode 1x2 sampling (not supported)\n"); + } else if (priv->component_infos[cY].Vfactor == 2) { + decode_MCU = decode_mcu_table[3]; + convert_to_pixfmt = colorspace_array_conv[3]; + xstride_by_mcu = 16; + ystride_by_mcu = 16; + // trace("Use decode 2x2 sampling\n"); + } else { + decode_MCU = decode_mcu_table[2]; + convert_to_pixfmt = colorspace_array_conv[2]; + xstride_by_mcu = 16; + // trace("Use decode 2x1 sampling\n"); + } + + resync(priv); + + /* Don't forget to that block can be either 8 or 16 lines */ + bytes_per_blocklines[0] *= ystride_by_mcu; + bytes_per_blocklines[1] *= ystride_by_mcu; + bytes_per_blocklines[2] *= ystride_by_mcu; + + bytes_per_mcu[0] *= xstride_by_mcu/8; + bytes_per_mcu[1] *= xstride_by_mcu/8; + bytes_per_mcu[2] *= xstride_by_mcu/8; + + /* Just the decode the image by macroblock (size is 8x8, 8x16, or 16x16) */ + for (y=0; y < priv->height/ystride_by_mcu; y++) + { + //trace("Decoding row %d\n", y); + priv->plane[0] = priv->components[0] + (y * bytes_per_blocklines[0]); + priv->plane[1] = priv->components[1] + (y * bytes_per_blocklines[1]); + priv->plane[2] = priv->components[2] + (y * bytes_per_blocklines[2]); + for (x=0; x < priv->width; x+=xstride_by_mcu) + { + decode_MCU(priv); + convert_to_pixfmt(priv); + priv->plane[0] += bytes_per_mcu[0]; + priv->plane[1] += bytes_per_mcu[1]; + priv->plane[2] += bytes_per_mcu[2]; + if (priv->restarts_to_go>0) + { + priv->restarts_to_go--; + if (priv->restarts_to_go == 0) + { + priv->stream -= (priv->nbits_in_reservoir/8); + resync(priv); + if (find_next_rst_marker(priv) < 0) + return -1; + } + } + } + } + + // trace("Input file size: %d\n", priv->stream_length+2); + // trace("Input bytes actually read: %d\n", priv->stream - priv->stream_begin + 2); + + return 0; +} + +const char *tinyjpeg_get_errorstring(struct jdec_private *priv) +{ + /* FIXME: the error string must be store in the context */ + priv = priv; + return error_string; +} + +void tinyjpeg_get_size(struct jdec_private *priv, unsigned int *width, unsigned int *height) +{ + *width = priv->width; + *height = priv->height; +} + +int tinyjpeg_get_components(struct jdec_private *priv, unsigned char **components) +{ + int i; + for (i=0; priv->components[i] && i<COMPONENTS; i++) + components[i] = priv->components[i]; + return 0; +} + +int tinyjpeg_set_components(struct jdec_private *priv, unsigned char **components, unsigned int ncomponents) +{ + unsigned int i; + if (ncomponents > COMPONENTS) + ncomponents = COMPONENTS; + for (i=0; i<ncomponents; i++) + priv->components[i] = components[i]; + return 0; +} + +int tinyjpeg_set_flags(struct jdec_private *priv, int flags) +{ + int oldflags = priv->flags; + priv->flags = flags; + return oldflags; +} + diff --git a/libIGraph/tinyjpeg.h b/libIGraph/tinyjpeg.h new file mode 100644 index 0000000..33e126c --- /dev/null +++ b/libIGraph/tinyjpeg.h @@ -0,0 +1,73 @@ +/* + * Small jpeg decoder library (header file) + * + * Copyright (c) 2006, Luc Saillard <luc@saillard.org> + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * - Neither the name of the author nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + + +#ifndef __JPEGDEC_H__ +#define __JPEGDEC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +struct jdec_private; + +/* Flags that can be set by any applications */ +#define TINYJPEG_FLAGS_MJPEG_TABLE (1<<1) + +/* Format accepted in outout */ +enum tinyjpeg_fmt { + TINYJPEG_FMT_GREY = 1, + TINYJPEG_FMT_BGR24, + TINYJPEG_FMT_RGB24, + TINYJPEG_FMT_YUV420P, +}; + +struct jdec_private *tinyjpeg_init(void); +void tinyjpeg_free(struct jdec_private *priv); + +int tinyjpeg_parse_header(struct jdec_private *priv, const unsigned char *buf, unsigned int size); +int tinyjpeg_decode(struct jdec_private *priv, int pixel_format); +const char *tinyjpeg_get_errorstring(struct jdec_private *priv); +void tinyjpeg_get_size(struct jdec_private *priv, unsigned int *width, unsigned int *height); +int tinyjpeg_get_components(struct jdec_private *priv, unsigned char **components); +int tinyjpeg_set_components(struct jdec_private *priv, unsigned char **components, unsigned int ncomponents); +int tinyjpeg_set_flags(struct jdec_private *priv, int flags); + +#ifdef __cplusplus +} +#endif + +#endif + + +