blob: 8c084a67b6366904db9be5b10a46c95334ca27f1 [file] [log] [blame]
reed@google.comd71fe992013-02-25 20:38:07 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkFontConfigInterface_DEFINED
9#define SkFontConfigInterface_DEFINED
10
reed@google.com027fd202013-04-19 20:45:30 +000011#include "SkDataTable.h"
reed@google.com54c69142013-04-09 15:54:52 +000012#include "SkFontStyle.h"
reed@google.comd71fe992013-02-25 20:38:07 +000013#include "SkRefCnt.h"
reed@google.com027fd202013-04-19 20:45:30 +000014#include "SkTArray.h"
reed@google.com80f54652013-02-25 22:19:20 +000015#include "SkTypeface.h"
reed@google.comd71fe992013-02-25 20:38:07 +000016
tomhudsone438ddb2014-07-01 18:54:41 -070017struct SkBaseMutex;
18
reed@google.comd71fe992013-02-25 20:38:07 +000019/**
20 * \class SkFontConfigInterface
21 *
22 * Provides SkFontHost clients with access to fontconfig services. They will
23 * access the global instance found in RefGlobal().
24 */
reed@google.com86a44b82013-03-04 17:26:02 +000025class SK_API SkFontConfigInterface : public SkRefCnt {
reed@google.comd71fe992013-02-25 20:38:07 +000026public:
commit-bot@chromium.orgef284a82013-07-11 22:29:29 +000027 SK_DECLARE_INST_COUNT(SkFontConfigInterface)
28
reed@google.comd71fe992013-02-25 20:38:07 +000029 /**
30 * Returns the global SkFontConfigInterface instance, and if it is not
31 * NULL, calls ref() on it. The caller must balance this with a call to
32 * unref().
33 */
34 static SkFontConfigInterface* RefGlobal();
35
36 /**
37 * Replace the current global instance with the specified one, safely
38 * ref'ing the new instance, and unref'ing the previous. Returns its
39 * parameter (the new global instance).
40 */
41 static SkFontConfigInterface* SetGlobal(SkFontConfigInterface*);
42
43 /**
reed@google.comf71a2332013-02-27 19:06:30 +000044 * This should be treated as private to the impl of SkFontConfigInterface.
45 * Callers should not change or expect any particular values. It is meant
46 * to be a union of possible storage types to aid the impl.
reed@google.comd71fe992013-02-25 20:38:07 +000047 */
reed@google.comf71a2332013-02-27 19:06:30 +000048 struct FontIdentity {
reed@google.com8c9737e2013-03-06 13:06:03 +000049 FontIdentity() : fID(0), fTTCIndex(0) {}
50
51 bool operator==(const FontIdentity& other) const {
52 return fID == other.fID &&
53 fTTCIndex == other.fTTCIndex &&
54 fString == other.fString;
55 }
reed@google.comf55061f2013-04-22 18:48:45 +000056 bool operator!=(const FontIdentity& other) const {
57 return !(*this == other);
58 }
reed@google.com8c9737e2013-03-06 13:06:03 +000059
60 uint32_t fID;
61 int32_t fTTCIndex;
reed@google.comf71a2332013-02-27 19:06:30 +000062 SkString fString;
reed@google.com54c69142013-04-09 15:54:52 +000063 SkFontStyle fStyle;
skia.committer@gmail.come36a1682013-04-23 07:01:29 +000064
reed@google.comf55061f2013-04-22 18:48:45 +000065 // If buffer is NULL, just return the number of bytes that would have
66 // been written. Will pad contents to a multiple of 4.
67 size_t writeToMemory(void* buffer = NULL) const;
skia.committer@gmail.come36a1682013-04-23 07:01:29 +000068
reed@google.comf55061f2013-04-22 18:48:45 +000069 // Recreate from a flattened buffer, returning the number of bytes read.
70 size_t readFromMemory(const void* buffer, size_t length);
reed@google.comf71a2332013-02-27 19:06:30 +000071 };
reed@google.comd71fe992013-02-25 20:38:07 +000072
73 /**
reed@google.comf71a2332013-02-27 19:06:30 +000074 * Given a familyName and style, find the best match.
75 *
76 * If a match is found, return true and set its outFontIdentifier.
77 * If outFamilyName is not null, assign the found familyName to it
78 * (which may differ from the requested familyName).
79 * If outStyle is not null, assign the found style to it
80 * (which may differ from the requested style).
81 *
82 * If a match is not found, return false, and ignore all out parameters.
reed@google.comd71fe992013-02-25 20:38:07 +000083 */
reed@google.comf71a2332013-02-27 19:06:30 +000084 virtual bool matchFamilyName(const char familyName[],
85 SkTypeface::Style requested,
86 FontIdentity* outFontIdentifier,
87 SkString* outFamilyName,
88 SkTypeface::Style* outStyle) = 0;
reed@google.comd71fe992013-02-25 20:38:07 +000089
90 /**
reed@google.comf71a2332013-02-27 19:06:30 +000091 * Given a FontRef, open a stream to access its data, or return null
92 * if the FontRef's data is not available. The caller is responsible for
bungeman5f213d92015-01-27 05:39:10 -080093 * deleting the stream when it is done accessing the data.
reed@google.comd71fe992013-02-25 20:38:07 +000094 */
bungeman5f213d92015-01-27 05:39:10 -080095 virtual SkStreamAsset* openStream(const FontIdentity&) = 0;
reed@google.comd66045e2013-03-04 19:07:02 +000096
97 /**
98 * Return a singleton instance of a direct subclass that calls into
99 * libfontconfig. This does not affect the refcnt of the returned instance.
tomhudsone438ddb2014-07-01 18:54:41 -0700100 * The mutex may be used to guarantee the singleton is only constructed once.
reed@google.comd66045e2013-03-04 19:07:02 +0000101 */
tomhudsone438ddb2014-07-01 18:54:41 -0700102 static SkFontConfigInterface* GetSingletonDirectInterface
103 (SkBaseMutex* mutex = NULL);
reed@google.com54c69142013-04-09 15:54:52 +0000104
105 // New APIS, which have default impls for now (which do nothing)
106
reed@google.com027fd202013-04-19 20:45:30 +0000107 virtual SkDataTable* getFamilyNames() { return SkDataTable::NewEmpty(); }
djsollenc87dd2c2014-11-14 11:11:46 -0800108 virtual bool matchFamilySet(const char[] /*inFamilyName*/,
109 SkString* /*outFamilyName*/,
reed@google.com027fd202013-04-19 20:45:30 +0000110 SkTArray<FontIdentity>*) {
111 return false;
robertphillips@google.com21db1db2013-04-09 23:56:51 +0000112 }
commit-bot@chromium.orgab1c1382013-12-05 12:08:12 +0000113 typedef SkRefCnt INHERITED;
reed@google.comd71fe992013-02-25 20:38:07 +0000114};
115
116#endif