/* * Copyright 2010 The Android Open Source Project * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include <string> #include "Test.h" #include "SkData.h" #include "SkPDFTypes.h" #include "SkPDFFont.h" #include "SkStream.h" static bool stream_equals(const SkDynamicMemoryWStream& stream, size_t offset, const char* buffer, size_t len) { SkAutoDataUnref data(stream.copyToData()); if (offset + len > data.size()) { return false; } if (len != strlen(buffer)) { return false; } return memcmp(data.bytes() + offset, buffer, len) == 0; } void append_cmap_sections(const SkTDArray<SkUnichar>& glyphToUnicode, const SkPDFGlyphSet* subset, SkDynamicMemoryWStream* cmap); static void TestToUnicode(skiatest::Reporter* reporter) { SkTDArray<SkUnichar> glyphToUnicode; SkTDArray<uint16_t> glyphsInSubset; SkPDFGlyphSet subset; glyphToUnicode.push(0); // 0 glyphToUnicode.push(0); // 1 glyphToUnicode.push(0); // 2 glyphsInSubset.push(3); glyphToUnicode.push(0x20); // 3 glyphsInSubset.push(4); glyphToUnicode.push(0x25); // 4 glyphsInSubset.push(5); glyphToUnicode.push(0x27); // 5 glyphsInSubset.push(6); glyphToUnicode.push(0x28); // 6 glyphsInSubset.push(7); glyphToUnicode.push(0x29); // 7 glyphsInSubset.push(8); glyphToUnicode.push(0x2F); // 8 glyphsInSubset.push(9); glyphToUnicode.push(0x33); // 9 glyphToUnicode.push(0); // 10 glyphsInSubset.push(11); glyphToUnicode.push(0x35); // 11 glyphsInSubset.push(12); glyphToUnicode.push(0x36); // 12 for (uint16_t i = 13; i < 0xFE; ++i) { glyphToUnicode.push(0); // Zero from index 0x9 to 0xFD } glyphsInSubset.push(0xFE); glyphToUnicode.push(0x1010); glyphsInSubset.push(0xFF); glyphToUnicode.push(0x1011); glyphsInSubset.push(0x100); glyphToUnicode.push(0x1012); glyphsInSubset.push(0x101); glyphToUnicode.push(0x1013); SkDynamicMemoryWStream buffer; subset.set(glyphsInSubset.begin(), glyphsInSubset.count()); append_cmap_sections(glyphToUnicode, &subset, &buffer); char expectedResult[] = "4 beginbfchar\n\ <0003> <0020>\n\ <0004> <0025>\n\ <0008> <002F>\n\ <0009> <0033>\n\ endbfchar\n\ 4 beginbfrange\n\ <0005> <0007> <0027>\n\ <000B> <000C> <0035>\n\ <00FE> <00FF> <1010>\n\ <0100> <0101> <1012>\n\ endbfrange\n"; REPORTER_ASSERT(reporter, stream_equals(buffer, 0, expectedResult, buffer.getOffset())); glyphToUnicode.reset(); glyphsInSubset.reset(); SkPDFGlyphSet subset2; // Test mapping: // I n s t a l // Glyph id 2c 51 56 57 44 4f // Unicode 49 6e 73 74 61 6c for (size_t i = 0; i < 100; ++i) { glyphToUnicode.push(i + 29); } glyphsInSubset.push(0x2C); glyphsInSubset.push(0x44); glyphsInSubset.push(0x4F); glyphsInSubset.push(0x51); glyphsInSubset.push(0x56); glyphsInSubset.push(0x57); SkDynamicMemoryWStream buffer2; subset2.set(glyphsInSubset.begin(), glyphsInSubset.count()); append_cmap_sections(glyphToUnicode, &subset2, &buffer2); char expectedResult2[] = "4 beginbfchar\n\ <002C> <0049>\n\ <0044> <0061>\n\ <004F> <006C>\n\ <0051> <006E>\n\ endbfchar\n\ 1 beginbfrange\n\ <0056> <0057> <0073>\n\ endbfrange\n"; REPORTER_ASSERT(reporter, stream_equals(buffer2, 0, expectedResult2, buffer2.getOffset())); } #include "TestClassDef.h" DEFINE_TESTCLASS("ToUnicode", ToUnicodeTestClass, TestToUnicode)