public void CancelValidation() { // tell the rasterizer to stop RasterInterf l_Rasterizer = RasterInterf.getInstance(); l_Rasterizer.CancelCalcDevMetrics(); l_Rasterizer.CancelRastTest(); }
/***************** * public methods */ public bool Validate() { bool bRet = true; int canrast; Validator v = GetFile().GetValidator(); if (v.PerformTest(T._OFFSET_sfntVersion)) { uint sfnt = m_OffsetTable.sfntVersion.GetUint(); if (!OTFile.IsValidSfntVersion(sfnt)) { v.Error(T._OFFSET_sfntVersion, E._OFFSET_E_InvalidSFNT, null, "0x" + sfnt.ToString("x8")); bRet = false; } } if (v.PerformTest(T._OFFSET_numTables)) { if (m_OffsetTable.numTables == 0) { v.Error(T._OFFSET_numTables, E._OFFSET_E_numTables, null); bRet = false; } else { v.Pass(T._OFFSET_numTables, P._OFFSET_P_numTables, null, m_OffsetTable.numTables.ToString()); } } if (v.PerformTest(T._OFFSET_BinarySearchFields)) { ushort numTables = m_OffsetTable.numTables; ushort CalculatedSearchRange = (ushort)(util.MaxPower2LE(numTables) * 16); ushort CalculatedEntrySelector = util.Log2(util.MaxPower2LE(numTables)); ushort CalculatedRangeShift = (ushort)(numTables * 16 - CalculatedSearchRange); bool bBinaryFieldsOk = true; if (m_OffsetTable.searchRange != CalculatedSearchRange) { v.Error(T._OFFSET_BinarySearchFields, E._OFFSET_E_searchRange, null, m_OffsetTable.searchRange.ToString()); bBinaryFieldsOk = false; bRet = false; } if (m_OffsetTable.entrySelector != CalculatedEntrySelector) { v.Error(T._OFFSET_BinarySearchFields, E._OFFSET_E_entrySelector, null, m_OffsetTable.entrySelector.ToString()); bBinaryFieldsOk = false; bRet = false; } if (m_OffsetTable.rangeShift != CalculatedRangeShift) { v.Error(T._OFFSET_BinarySearchFields, E._OFFSET_E_rangeShift, null, m_OffsetTable.rangeShift.ToString()); bBinaryFieldsOk = false; bRet = false; } if (bBinaryFieldsOk) { v.Pass(T._OFFSET_BinarySearchFields, P._OFFSET_P_BinarySearchTables, null); } } bRet &= CheckDirectoryEntriesNonZero(v); bRet &= CheckTablesInFileAndNotOverlapping(v); bRet &= CheckNoDuplicateTags(v); if (v.PerformTest(T._DE_TagsAscendingOrder)) { bRet &= CheckTagsAscending(v); } if (v.PerformTest(T._DE_TagNames)) { bRet &= CheckTagNames(v); } if (v.PerformTest(T._DE_TableAlignment)) { bRet &= CheckTableAlignment(v); } if (v.PerformTest(T._FONT_RequiredTables)) { bRet &= CheckForRequiredTables(v); } if (v.PerformTest(T._FONT_RecommendedTables)) { bRet &= CheckForRecommendedTables(v); } if (v.PerformTest(T._FONT_UnnecessaryTables)) { bRet &= CheckForNoUnnecessaryTables(v); } if (v.PerformTest(T._FONT_OptimalTableOrder)) { bRet &= CheckForOptimalTableOrder(v); } // Validate each table if (m_OffsetTable != null) { for (int i = 0; i < m_OffsetTable.DirectoryEntries.Count; i++) { // check to see if user canceled validation if (v.CancelFlag) { break; } // get the table DirectoryEntry de = (DirectoryEntry)m_OffsetTable.DirectoryEntries[i]; OTTable table = GetFile().GetTableManager().GetTable(this, de); // Will it really happen? if (GetFile().GetTableManager().GetUnaliasedTableName(de.tag) == "DSIG" && GetFile().IsCollection()) { continue; } if (GetFile().GetTableManager().GetUnaliasedTableName(de.tag) == "glyf" && Is_TTC_LaterIdenticalTable("glyf")) { v.Info(T.T_NULL, I.glyf_I_IDENTICAL_GLYF_TABLES_IN_TTC, de.tag, "glyf"); continue; } if (GetFile().GetTableManager().GetUnaliasedTableName(de.tag) == "EBDT" && Is_TTC_LaterIdenticalTable("EBDT")) { v.Info(T.T_NULL, I.glyf_I_IDENTICAL_GLYF_TABLES_IN_TTC, de.tag, "EBDT"); continue; } // Call the function that validates a single table bRet &= this.GetFile().ValidateTable(table, v, de, this); } } canrast = TestFontRasterization(); ushort numGlyphs = GetMaxpNumGlyphs(); // rasterization test - BW v.OnRastTestValidationEvent_BW(true); if (v.PeformRastTest_BW() && Is_TTC_LaterIdenticalTable("glyf")) { v.Info(T.T_NULL, I.glyf_I_IDENTICAL_GLYF_TABLES_IN_TTC, null, "B/W Rasterization"); } else if (v.PeformRastTest_BW()) { if (canrast > 0) { try { // fetch the rasterizer object and initialize it with this font RasterInterf ri = GetFile().GetRasterizer(); ri.RasterNewSfnt(GetFile().GetFileStream(), GetFontIndexInFile()); // call the rasterizer RasterInterf.UpdateProgressDelegate upg = new RasterInterf.UpdateProgressDelegate(v.OnTableProgress); RasterInterf.RastTestErrorDelegate rted = new RasterInterf.RastTestErrorDelegate(v.OnRastTestError); int x = v.GetRastTestXRes(); int y = v.GetRastTestYRes(); int [] pointsizes = v.GetRastTestPointSizes(); RastTestTransform rtt = v.GetRastTestTransform(); bRet &= ri.RastTest( x, y, pointsizes, rtt.stretchX, rtt.stretchY, rtt.rotation, rtt.skew, rtt.matrix, true, false, false, 0, rted, upg, numGlyphs); if (ri.GetRastErrorCount() == 0) { v.Pass(T.T_NULL, P._rast_P_rasterization, null); } } catch (Exception e) { v.ApplicationError(T.T_NULL, E._rast_A_ExceptionUnhandled, null, e.Message + e.StackTrace); } } else if (canrast == 0) { v.Info(T.T_NULL, I._rast_I_rasterization, null, GetDevMetricsDataError()); } else { v.Error(T.T_NULL, E._rast_E_rasterization, null, GetDevMetricsDataError()); bRet = false; } } else { v.Info(I._TEST_I_RastTestNotSelected, null); } v.OnRastTestValidationEvent_BW(false); // rasterization test - Grayscale v.OnRastTestValidationEvent_Grayscale(true); if (v.PeformRastTest_Grayscale() && Is_TTC_LaterIdenticalTable("glyf")) { v.Info(T.T_NULL, I.glyf_I_IDENTICAL_GLYF_TABLES_IN_TTC, null, "Grayscale Rasterization"); } else if (v.PeformRastTest_Grayscale()) { if (canrast > 0) { try { // fetch the rasterizer object and initialize it with this font RasterInterf ri = GetFile().GetRasterizer(); ri.RasterNewSfnt(GetFile().GetFileStream(), GetFontIndexInFile()); // call the rasterizer RasterInterf.UpdateProgressDelegate upg = new RasterInterf.UpdateProgressDelegate(v.OnTableProgress); RasterInterf.RastTestErrorDelegate rted = new RasterInterf.RastTestErrorDelegate(v.OnRastTestError); int x = v.GetRastTestXRes(); int y = v.GetRastTestYRes(); int [] pointsizes = v.GetRastTestPointSizes(); RastTestTransform rtt = v.GetRastTestTransform(); bRet &= ri.RastTest( x, y, pointsizes, rtt.stretchX, rtt.stretchY, rtt.rotation, rtt.skew, rtt.matrix, false, true, false, 0, rted, upg, numGlyphs); if (ri.GetRastErrorCount() == 0) { v.Pass(T.T_NULL, P._rast_P_rasterization, null); } } catch (Exception e) { v.ApplicationError(T.T_NULL, E._rast_A_ExceptionUnhandled, null, e.Message + e.StackTrace); } } else if (canrast == 0) { v.Info(T.T_NULL, I._rast_I_rasterization, null, GetDevMetricsDataError()); } else { v.Error(T.T_NULL, E._rast_E_rasterization, null, GetDevMetricsDataError()); bRet = false; } } else { v.Info(I._TEST_I_RastTestNotSelected, null); } v.OnRastTestValidationEvent_Grayscale(false); // rasterization test - Cleartype v.OnRastTestValidationEvent_Cleartype(true); if (v.PeformRastTest_Cleartype() && Is_TTC_LaterIdenticalTable("glyf")) { v.Info(T.T_NULL, I.glyf_I_IDENTICAL_GLYF_TABLES_IN_TTC, null, "Cleartype Rasterization"); } else if (v.PeformRastTest_Cleartype()) { if (canrast > 0) { try { uint CTFlags = v.GetCleartypeFlags(); // fetch the rasterizer object and initialize it with this font RasterInterf ri = GetFile().GetRasterizer(); ri.RasterNewSfnt(GetFile().GetFileStream(), GetFontIndexInFile()); // call the rasterizer RasterInterf.UpdateProgressDelegate upg = new RasterInterf.UpdateProgressDelegate(v.OnTableProgress); RasterInterf.RastTestErrorDelegate rted = new RasterInterf.RastTestErrorDelegate(v.OnRastTestError); int x = v.GetRastTestXRes(); int y = v.GetRastTestYRes(); int [] pointsizes = v.GetRastTestPointSizes(); RastTestTransform rtt = v.GetRastTestTransform(); bRet &= ri.RastTest( x, y, pointsizes, rtt.stretchX, rtt.stretchY, rtt.rotation, rtt.skew, rtt.matrix, false, false, true, CTFlags, rted, upg, numGlyphs); if (ri.GetRastErrorCount() == 0) { v.Pass(T.T_NULL, P._rast_P_rasterization, null); } } catch (Exception e) { v.ApplicationError(T.T_NULL, E._rast_A_ExceptionUnhandled, null, e.Message + e.StackTrace); } } else if (canrast == 0) { v.Info(T.T_NULL, I._rast_I_rasterization, null, GetDevMetricsDataError()); } else { v.Error(T.T_NULL, E._rast_E_rasterization, null, GetDevMetricsDataError()); bRet = false; } } else { v.Info(I._TEST_I_RastTestNotSelected, null); } v.OnRastTestValidationEvent_Cleartype(false); return(bRet); }
public RasterInterf.DevMetricsData GetCalculatedDevMetrics() { if (m_DevMetricsData != null) { return(m_DevMetricsData); } // get numGlyphs ushort numGlyphs = GetMaxpNumGlyphs(); // hdmx byte [] hdmxPointSizes = null; ushort maxHdmxPointSize = 0; Table_hdmx hdmxTable = (Table_hdmx)GetTable("hdmx"); int bCalc_hdmx = 0; if (hdmxTable != null && GetFile().GetValidator().TestTable("hdmx")) { bCalc_hdmx = 1; // the hdmxPointSizes array stores a 1 for each pixel size represented in the hdmx table //hdmxPointSizes = new byte[numGlyphs]; hdmxPointSizes = new byte[256]; for (uint i = 0; i < hdmxTable.NumberDeviceRecords; i++) { Table_hdmx.DeviceRecord dr = hdmxTable.GetDeviceRecord(i, numGlyphs); hdmxPointSizes[dr.PixelSize] = 1; if (maxHdmxPointSize < dr.PixelSize) { maxHdmxPointSize = dr.PixelSize; } } } // LTSH Table_LTSH LTSHTable = (Table_LTSH)GetTable("LTSH"); int bCalc_LTSH = 0; if (LTSHTable != null && GetFile().GetValidator().TestTable("LTSH")) { bCalc_LTSH = 1; } // VDMX byte uchPixelHeightRangeStart = 8; //#define DEFAULT_PixelHeightRangeStart 8 byte uchPixelHeightRangeEnd = 255; //#define DEFAULT_PixelHeightRangeEnd 255 ushort [] VDMXxResolution = new ushort[1]; ushort [] VDMXyResolution = new ushort[1]; VDMXxResolution[0] = 72; // always calculate at least a 1:1 ratio (used for calculating hdmx and LTSH) VDMXyResolution[0] = 72; // cacheTT code used 72:72, I think using 1:1 here will make the cacheTT code fail ushort cVDMXResolutions = 1; Table_VDMX VDMXTable = (Table_VDMX)GetTable("VDMX"); int bCalc_VDMX = 0; if (VDMXTable != null && GetFile().GetValidator().TestTable("VDMX")) { bCalc_VDMX = 1; Table_VDMX.Vdmx VdmxGroup = VDMXTable.GetVdmxGroup(0); uchPixelHeightRangeStart = VdmxGroup.startsz; uchPixelHeightRangeEnd = VdmxGroup.endsz; VDMXxResolution = new ushort[VDMXTable.numRatios]; VDMXyResolution = new ushort[VDMXTable.numRatios]; for (uint i = 0; i < VDMXTable.numRatios; i++) { Table_VDMX.Ratios ratio = VDMXTable.GetRatioRange(i); VDMXxResolution[i] = ratio.xRatio; VDMXyResolution[i] = ratio.yStartRatio; // cacheTT code seems to expect unreduced ratios if (VDMXxResolution[i] < 72 && VDMXyResolution[i] < 72) { VDMXxResolution[i] *= 72; VDMXyResolution[i] *= 72; } } cVDMXResolutions = VDMXTable.numRatios; } // make sure that we are going to have a known problem with the // rasterizer due to missing tables or bad offsets if (TestFontRasterization() > 0) { // fetch the rasterizer object and initialize it with this font RasterInterf ri = GetFile().GetRasterizer(); ri.RasterNewSfnt(GetFile().GetFileStream(), GetFontIndexInFile()); // calculate the cached data try { Validator v = GetFile().GetValidator(); RasterInterf.UpdateProgressDelegate upg = new RasterInterf.UpdateProgressDelegate(v.OnTableProgress); m_DevMetricsData = ri.CalcDevMetrics(bCalc_hdmx, bCalc_LTSH, bCalc_VDMX, numGlyphs, hdmxPointSizes, maxHdmxPointSize, uchPixelHeightRangeStart, uchPixelHeightRangeEnd, VDMXxResolution, VDMXyResolution, cVDMXResolutions, upg); } catch (Exception e) { m_sDevMetricsDataError = e.Message; } } return(m_DevMetricsData); }
public RasterInterf GetRasterizer() { return(RasterInterf.getInstance()); }