1bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien/*
2bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien * Copyright (C) 2013 The Android Open Source Project
3bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien *
4bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien * Licensed under the Apache License, Version 2.0 (the "License");
5bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien * you may not use this file except in compliance with the License.
6bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien * You may obtain a copy of the License at
7bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien *
8bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien *      http://www.apache.org/licenses/LICENSE-2.0
9bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien *
10bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien * Unless required by applicable law or agreed to in writing, software
11bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien * distributed under the License is distributed on an "AS IS" BASIS,
12bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien * See the License for the specific language governing permissions and
14bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien * limitations under the License.
15bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien */
16bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien
17bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien#ifndef MINIKIN_FONT_FREETYPE_H
18bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien#define MINIKIN_FONT_FREETYPE_H
19bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien
20bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien#include <ft2build.h>
21bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien#include FT_FREETYPE_H
22bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien#include FT_TRUETYPE_TABLES_H
23bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien
24bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien#include <minikin/MinikinFont.h>
25bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien
26bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien// An abstraction for platform fonts, allowing Minikin to be used with
27bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien// multiple actual implementations of fonts.
28bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien
29bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Leviennamespace android {
30bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien
31bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levienstruct GlyphBitmap {
32bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    uint8_t *buffer;
33bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    int width;
34bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    int height;
35bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    int left;
36bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    int top;
37bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien};
38bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien
39bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levienclass MinikinFontFreeType : public MinikinFont {
40bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levienpublic:
41bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    explicit MinikinFontFreeType(FT_Face typeface);
42bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien
43bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    ~MinikinFontFreeType();
44bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien
45bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    float GetHorizontalAdvance(uint32_t glyph_id,
46bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien        const MinikinPaint &paint) const;
47bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien
48d133eab2a1a59ce4a5b1b3db04ec00dc0dbdf349Raph Levien    void GetBounds(MinikinRect* bounds, uint32_t glyph_id,
49d133eab2a1a59ce4a5b1b3db04ec00dc0dbdf349Raph Levien        const MinikinPaint& paint) const;
50d133eab2a1a59ce4a5b1b3db04ec00dc0dbdf349Raph Levien
51aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien    const void* GetTable(uint32_t tag, size_t* size, MinikinDestroyFunc* destroy);
52aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien
53aaa4e3470270496e6eb80704eadecb2cb7c56bf0Raph Levien    // TODO: provide access to raw data, as an optimization.
54bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien
55bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    // Not a virtual method, as the protocol to access rendered
56bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    // glyph bitmaps is probably different depending on the
57bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    // backend.
58bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    bool Render(uint32_t glyph_id,
59bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien        const MinikinPaint &paint, GlyphBitmap *result);
60bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien
61bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    MinikinFontFreeType* GetFreeType();
62bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien
63bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levienprivate:
64bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    FT_Face mTypeface;
65bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    static int32_t sIdCounter;
66bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien};
67bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien
68bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien}  // namespace android
69bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien
70bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien#endif  // MINIKIN_FONT_FREETYPE_H
71