18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright 2009, The Android Open Source Project
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Apple Computer, Inc.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
5e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * Redistribution and use in source and binary forms, with or without
6e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * modification, are permitted provided that the following conditions
7e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * are met:
8e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block *  * Redistributions of source code must retain the above copyright
9e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block *    notice, this list of conditions and the following disclaimer.
10e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block *  * Redistributions in binary form must reproduce the above copyright
11e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block *    notice, this list of conditions and the following disclaimer in the
12e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block *    documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
14e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
15e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block//This file is part of the internal font implementation.  It should not be included by anyone other than
28e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block// FontMac.cpp, FontWin.cpp and Font.cpp.
29e03118fd5d9b776df29de3f96232ed6b5395c845Steve Block
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontPlatformData.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33c882e887207fecca865d26ab84fcc541c1b08fd9claireho#ifdef SUPPORT_COMPLEX_SCRIPTS
34c882e887207fecca865d26ab84fcc541c1b08fd9claireho#include "HarfbuzzSkia.h"
35c882e887207fecca865d26ab84fcc541c1b08fd9claireho#endif
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkPaint.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SkTypeface.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//#define TRACE_FONTPLATFORMDATA_LIFE
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//#define COUNT_FONTPLATFORMDATA_LIFE
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef COUNT_FONTPLATFORMDATA_LIFE
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int gCount;
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic int gMaxCount;
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void inc_count()
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (++gCount > gMaxCount)
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        gMaxCount = gCount;
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SkDebugf("---------- FontPlatformData %d\n", gMaxCount);
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void dec_count() { --gCount; }
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #define inc_count()
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #define dec_count()
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef TRACE_FONTPLATFORMDATA_LIFE
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #define trace(num)  SkDebugf("FontPlatformData%d %p %g %d %d\n", num, mTypeface, mTextSize, mFakeBold, mFakeItalic)
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #define trace(num)
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
69c882e887207fecca865d26ab84fcc541c1b08fd9clairehoFontPlatformData::RefCountedHarfbuzzFace::~RefCountedHarfbuzzFace()
70c882e887207fecca865d26ab84fcc541c1b08fd9claireho{
71c882e887207fecca865d26ab84fcc541c1b08fd9claireho#ifdef SUPPORT_COMPLEX_SCRIPTS
72c882e887207fecca865d26ab84fcc541c1b08fd9claireho    HB_FreeFace(m_harfbuzzFace);
73c882e887207fecca865d26ab84fcc541c1b08fd9claireho#endif
74c882e887207fecca865d26ab84fcc541c1b08fd9claireho}
75c882e887207fecca865d26ab84fcc541c1b08fd9claireho
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFontPlatformData::FontPlatformData()
77295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho    : mTypeface(NULL), mTextSize(0), mFakeBold(false), mFakeItalic(false),
78295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho      mOrientation(Horizontal), mTextOrientation(TextOrientationVerticalRight)
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inc_count();
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    trace(1);
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFontPlatformData::FontPlatformData(const FontPlatformData& src)
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hashTableDeletedFontValue() != src.mTypeface) {
87b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger        SkSafeRef(src.mTypeface);
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mTypeface   = src.mTypeface;
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mTextSize   = src.mTextSize;
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mFakeBold   = src.mFakeBold;
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mFakeItalic = src.mFakeItalic;
95c882e887207fecca865d26ab84fcc541c1b08fd9claireho    m_harfbuzzFace = src.m_harfbuzzFace;
96295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho    mOrientation = src.mOrientation;
97295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho    mTextOrientation = src.mTextOrientation;
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inc_count();
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    trace(2);
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
103295fd960c28a38cfa7a28d4b8f68f474394f7fb0clairehoFontPlatformData::FontPlatformData(SkTypeface* tf, float textSize, bool fakeBold, bool fakeItalic,
104295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho    FontOrientation orientation, TextOrientation textOrientation)
105295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho    : mTypeface(tf), mTextSize(textSize), mFakeBold(fakeBold), mFakeItalic(fakeItalic),
106295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho      mOrientation(orientation), mTextOrientation(textOrientation)
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hashTableDeletedFontValue() != mTypeface) {
109b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger        SkSafeRef(mTypeface);
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
111c882e887207fecca865d26ab84fcc541c1b08fd9claireho
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inc_count();
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    trace(3);
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFontPlatformData::FontPlatformData(const FontPlatformData& src, float textSize)
117c882e887207fecca865d26ab84fcc541c1b08fd9claireho    : mTypeface(src.mTypeface), mTextSize(textSize), mFakeBold(src.mFakeBold), mFakeItalic(src.mFakeItalic),
118295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho      m_harfbuzzFace(src.m_harfbuzzFace), mOrientation(src.mOrientation), mTextOrientation(src.mTextOrientation)
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hashTableDeletedFontValue() != mTypeface) {
121b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger        SkSafeRef(mTypeface);
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inc_count();
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    trace(4);
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
127c882e887207fecca865d26ab84fcc541c1b08fd9claireho
1288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianFontPlatformData::FontPlatformData(float size, bool bold, bool oblique)
129295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho    : mTypeface(NULL), mTextSize(size), mFakeBold(bold), mFakeItalic(oblique),
130295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho      mOrientation(Horizontal), mTextOrientation(TextOrientationVerticalRight)
1318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
1328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    inc_count();
1338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    trace(5);
1348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
1358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1366afb175cd4fceab68383533f7f8539100067c5c9Russell BrennerFontPlatformData::FontPlatformData(const FontPlatformData& src, SkTypeface* tf)
1376afb175cd4fceab68383533f7f8539100067c5c9Russell Brenner    : mTypeface(tf), mTextSize(src.mTextSize), mFakeBold(src.mFakeBold),
138295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho      mFakeItalic(src.mFakeItalic), mOrientation(src.mOrientation),
139295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho      mTextOrientation(src.mTextOrientation)
1406afb175cd4fceab68383533f7f8539100067c5c9Russell Brenner{
1416afb175cd4fceab68383533f7f8539100067c5c9Russell Brenner    if (hashTableDeletedFontValue() != mTypeface) {
1426afb175cd4fceab68383533f7f8539100067c5c9Russell Brenner        SkSafeRef(mTypeface);
1436afb175cd4fceab68383533f7f8539100067c5c9Russell Brenner    }
1446afb175cd4fceab68383533f7f8539100067c5c9Russell Brenner
1456afb175cd4fceab68383533f7f8539100067c5c9Russell Brenner    inc_count();
1466afb175cd4fceab68383533f7f8539100067c5c9Russell Brenner    trace(6);
1476afb175cd4fceab68383533f7f8539100067c5c9Russell Brenner}
1486afb175cd4fceab68383533f7f8539100067c5c9Russell Brenner
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFontPlatformData::~FontPlatformData()
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    dec_count();
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef TRACE_FONTPLATFORMDATA_LIFE
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SkDebugf("----------- ~FontPlatformData\n");
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hashTableDeletedFontValue() != mTypeface) {
157b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger        SkSafeUnref(mTypeface);
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFontPlatformData& FontPlatformData::operator=(const FontPlatformData& src)
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hashTableDeletedFontValue() != src.mTypeface) {
164b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger        SkSafeRef(src.mTypeface);
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hashTableDeletedFontValue() != mTypeface) {
167b33016812afef21c69df5ab3d5b85eab5fef7c5cDerek Sollenberger        SkSafeUnref(mTypeface);
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mTypeface   = src.mTypeface;
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mTextSize   = src.mTextSize;
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mFakeBold   = src.mFakeBold;
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    mFakeItalic = src.mFakeItalic;
174c882e887207fecca865d26ab84fcc541c1b08fd9claireho    m_harfbuzzFace = src.m_harfbuzzFace;
175295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho    mOrientation = src.mOrientation;
176295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho    mTextOrientation = src.mTextOrientation;
177c882e887207fecca865d26ab84fcc541c1b08fd9claireho
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return *this;
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FontPlatformData::setupPaint(SkPaint* paint) const
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float ts = mTextSize;
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!(ts > 0))
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ts = 12;
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
187dd816e39169b0fd3390257c1b43fb96f9b87577bRussell Brenner    if (hashTableDeletedFontValue() == mTypeface)
188dd816e39169b0fd3390257c1b43fb96f9b87577bRussell Brenner        paint->setTypeface(0);
189dd816e39169b0fd3390257c1b43fb96f9b87577bRussell Brenner    else
190dd816e39169b0fd3390257c1b43fb96f9b87577bRussell Brenner        paint->setTypeface(mTypeface);
191dd816e39169b0fd3390257c1b43fb96f9b87577bRussell Brenner
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    paint->setAntiAlias(true);
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    paint->setSubpixelText(true);
194efcd15d5b86039cd8ccdc5ce6777a56132677550Mike Reed    paint->setHinting(SkPaint::kSlight_Hinting);
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    paint->setTextSize(SkFloatToScalar(ts));
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    paint->setFakeBoldText(mFakeBold);
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    paint->setTextSkewX(mFakeItalic ? -SK_Scalar1/4 : 0);
198c882e887207fecca865d26ab84fcc541c1b08fd9claireho#ifndef SUPPORT_COMPLEX_SCRIPTS
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    paint->setTextEncoding(SkPaint::kUTF16_TextEncoding);
200c882e887207fecca865d26ab84fcc541c1b08fd9claireho#endif
201c882e887207fecca865d26ab84fcc541c1b08fd9claireho}
202c882e887207fecca865d26ab84fcc541c1b08fd9claireho
203c882e887207fecca865d26ab84fcc541c1b08fd9clairehouint32_t FontPlatformData::uniqueID() const
204c882e887207fecca865d26ab84fcc541c1b08fd9claireho{
205dd816e39169b0fd3390257c1b43fb96f9b87577bRussell Brenner    if (hashTableDeletedFontValue() == mTypeface)
206dd816e39169b0fd3390257c1b43fb96f9b87577bRussell Brenner        return SkTypeface::UniqueID(0);
207dd816e39169b0fd3390257c1b43fb96f9b87577bRussell Brenner    else
208dd816e39169b0fd3390257c1b43fb96f9b87577bRussell Brenner        return SkTypeface::UniqueID(mTypeface);
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool FontPlatformData::operator==(const FontPlatformData& a) const
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return  mTypeface == a.mTypeface &&
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            mTextSize == a.mTextSize &&
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            mFakeBold == a.mFakeBold &&
216295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho            mFakeItalic == a.mFakeItalic &&
217295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho            mOrientation == a.mOrientation &&
218295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho            mTextOrientation == a.mTextOrientation;
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectunsigned FontPlatformData::hash() const
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned h;
224c882e887207fecca865d26ab84fcc541c1b08fd9claireho
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (hashTableDeletedFontValue() == mTypeface) {
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        h = reinterpret_cast<unsigned>(mTypeface);
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        h = SkTypeface::UniqueID(mTypeface);
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
230c882e887207fecca865d26ab84fcc541c1b08fd9claireho
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    uint32_t sizeAsInt = *reinterpret_cast<const uint32_t*>(&mTextSize);
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
233295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho    h ^= 0x01010101 * ((static_cast<int>(mTextOrientation) << 3) | (static_cast<int>(mOrientation) << 2) |
234295fd960c28a38cfa7a28d4b8f68f474394f7fb0claireho         ((int)mFakeBold << 1) | (int)mFakeItalic);
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    h ^= sizeAsInt;
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return h;
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
239af8f2e55f0a34a87ebc57a2a9c60092e2da89883Russell Brennerbool FontPlatformData::isFixedPitch() const
240af8f2e55f0a34a87ebc57a2a9c60092e2da89883Russell Brenner{
241dd816e39169b0fd3390257c1b43fb96f9b87577bRussell Brenner    if (mTypeface && (mTypeface != hashTableDeletedFontValue()))
242dd816e39169b0fd3390257c1b43fb96f9b87577bRussell Brenner        return mTypeface->isFixedWidth();
243dd816e39169b0fd3390257c1b43fb96f9b87577bRussell Brenner    else
244dd816e39169b0fd3390257c1b43fb96f9b87577bRussell Brenner        return false;
245af8f2e55f0a34a87ebc57a2a9c60092e2da89883Russell Brenner}
246af8f2e55f0a34a87ebc57a2a9c60092e2da89883Russell Brenner
247c882e887207fecca865d26ab84fcc541c1b08fd9clairehoHB_FaceRec_* FontPlatformData::harfbuzzFace() const
248c882e887207fecca865d26ab84fcc541c1b08fd9claireho{
249c882e887207fecca865d26ab84fcc541c1b08fd9claireho#ifdef SUPPORT_COMPLEX_SCRIPTS
250c882e887207fecca865d26ab84fcc541c1b08fd9claireho    if (!m_harfbuzzFace)
251c882e887207fecca865d26ab84fcc541c1b08fd9claireho        m_harfbuzzFace = RefCountedHarfbuzzFace::create(
252c882e887207fecca865d26ab84fcc541c1b08fd9claireho            HB_NewFace(const_cast<FontPlatformData*>(this), harfbuzzSkiaGetTable));
253c882e887207fecca865d26ab84fcc541c1b08fd9claireho
254c882e887207fecca865d26ab84fcc541c1b08fd9claireho    return m_harfbuzzFace->face();
255c882e887207fecca865d26ab84fcc541c1b08fd9claireho#else
256c882e887207fecca865d26ab84fcc541c1b08fd9claireho    return NULL;
257c882e887207fecca865d26ab84fcc541c1b08fd9claireho#endif
258c882e887207fecca865d26ab84fcc541c1b08fd9claireho}
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
260