1419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com/* 2419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com * Copyright 2011 Google Inc. 3419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com * 4419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com * Use of this source code is governed by a BSD-style license that can be 5419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com * found in the LICENSE file. 6419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com */ 7e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.org 8dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com#include "SkPaint.h" 9419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com#include "SkUtils.h" 108f6884aab8aecd7657cf3f9cdbc682f0deca29c5tfarina@chromium.org#include "Test.h" 11419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com 12419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com// Unicode Variation Selector ranges: inclusive 13419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com#define UVS_MIN0 0x180B 14419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com#define UVS_MAX0 0x180D 15419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com#define UVS_MIN1 0xFE00 16419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com#define UVS_MAX1 0xFE0F 17419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com#define UVS_MIN2 0xE0100 18419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com#define UVS_MAX2 0xE01EF 19419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com 20419f43348ab6c9226b82490d41c736230ae3bf41reed@google.comstatic bool isUVS(SkUnichar uni) { 21419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com return (uni >= UVS_MIN0 && uni <= UVS_MAX0) || 22419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com (uni >= UVS_MIN1 && uni <= UVS_MAX1) || 23419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com (uni >= UVS_MIN2 && uni <= UVS_MAX2); 24419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com} 25419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com 26419f43348ab6c9226b82490d41c736230ae3bf41reed@google.comstatic void test_uvs(skiatest::Reporter* reporter) { 27419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com // [min, max], [min, max] ... inclusive 28419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com static const SkUnichar gRanges[] = { 29419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com UVS_MIN0, UVS_MAX0, UVS_MIN1, UVS_MAX1, UVS_MIN2, UVS_MAX2 30419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com }; 31419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com 32419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gRanges); i += 2) { 33419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com for (SkUnichar uni = gRanges[i] - 8; uni <= gRanges[i+1] + 8; ++uni) { 34419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com bool uvs0 = isUVS(uni); 35419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com bool uvs1 = SkUnichar_IsVariationSelector(uni); 36419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com REPORTER_ASSERT(reporter, uvs0 == uvs1); 37419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com } 38419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com } 39419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com} 40419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com 41dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com// Simple test to ensure that when we call textToGlyphs, we get the same 42dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com// result (for the same text) when using UTF8, UTF16, UTF32. 43dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com// TODO: make the text more complex (i.e. incorporate chars>7bits) 44dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.comstatic void test_textencodings(skiatest::Reporter* reporter) { 45dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com const char text8[] = "ABCDEFGabcdefg0123456789"; 46dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com uint16_t text16[sizeof(text8)]; 47dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com int32_t text32[sizeof(text8)]; 48dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com size_t len8 = strlen(text8); 49dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com size_t len16 = len8 * 2; 50dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com size_t len32 = len8 * 4; 51dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com 52dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com // expand our 8bit chars to 16 and 32 53dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com for (size_t i = 0; i < len8; ++i) { 54dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com text32[i] = text16[i] = text8[i]; 55dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com } 56dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com 57dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com uint16_t glyphs8[sizeof(text8)]; 58dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com uint16_t glyphs16[sizeof(text8)]; 59dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com uint16_t glyphs32[sizeof(text8)]; 60dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com 61dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com SkPaint paint; 62dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com 63dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com paint.setTextEncoding(SkPaint::kUTF8_TextEncoding); 64dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com int count8 = paint.textToGlyphs(text8, len8, glyphs8); 65dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com 66dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com paint.setTextEncoding(SkPaint::kUTF16_TextEncoding); 67dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com int count16 = paint.textToGlyphs(text16, len16, glyphs16); 68dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com 69dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com paint.setTextEncoding(SkPaint::kUTF32_TextEncoding); 70dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com int count32 = paint.textToGlyphs(text32, len32, glyphs32); 71dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com 726f86c3e0a63271d42473d73175a933f632b19243bsalomon@google.com REPORTER_ASSERT(reporter, (int)len8 == count8); 736f86c3e0a63271d42473d73175a933f632b19243bsalomon@google.com REPORTER_ASSERT(reporter, (int)len8 == count16); 746f86c3e0a63271d42473d73175a933f632b19243bsalomon@google.com REPORTER_ASSERT(reporter, (int)len8 == count32); 75d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 76dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com REPORTER_ASSERT(reporter, !memcmp(glyphs8, glyphs16, count8 * sizeof(uint16_t))); 77dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com REPORTER_ASSERT(reporter, !memcmp(glyphs8, glyphs32, count8 * sizeof(uint16_t))); 78dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com} 79dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com 80e4fafb146e85cdfcf9d5418597b6818aa0754adatfarina@chromium.orgDEF_TEST(Unicode, reporter) { 81419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com test_uvs(reporter); 82dc5f76d806dd9299630ba2d05447e49f34be034dreed@google.com test_textencodings(reporter); 83419f43348ab6c9226b82490d41c736230ae3bf41reed@google.com} 84