Layout.h revision 3f1ea5da2ee12b0d95c17c56928c3e553d4eeda0
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/*
2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright (C) 2013 The Android Open Source Project
3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License.
6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at
7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *      http://www.apache.org/licenses/LICENSE-2.0
9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software
11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and
14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License.
15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */
16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang
176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#ifndef MINIKIN_LAYOUT_H
186315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#define MINIKIN_LAYOUT_H
19e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
206315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include <hb.h>
21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
22e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <vector>
23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include <minikin/CssParse.h>
25e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <minikin/FontCollection.h>
26e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include <minikin/MinikinFontFreeType.h>
27e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaonamespace android {
29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
30e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines// The Bitmap class is for debugging. We'll probably move it out
310a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao// of here into a separate lightweight software rendering module
326315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr// (optional, as we'd hope most clients would do their own)
336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonrclass Bitmap {
34a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Changpublic:
35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    Bitmap(int width, int height);
36641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    ~Bitmap();
37641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    void writePnm(std::ofstream& o) const;
38641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang    void drawGlyph(const GlyphBitmap& bitmap, int x, int y);
39641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Changprivate:
40e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines    int width;
41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    int height;
429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    uint8_t* buf;
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao};
449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaostruct LayoutGlyph {
469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // index into mFaces and mHbFonts vectors. We could imagine
479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // moving this into a run length representation, because it's
489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // more efficient for long strings, and we'll probably need
496315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    // something like that for paint attributes (color, underline,
509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // fake b/i, etc), as having those per-glyph is bloated.
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int font_ix;
529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    unsigned int glyph_id;
549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    float x;
556315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    float y;
569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao};
579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// Internal state used during layout operation
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoclass LayoutContext;
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// Lifecycle and threading assumptions for Layout:
629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao// The object is assumed to be owned by a single thread; multiple threads
630da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang// may not mutate it at the same time.
640da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang// The lifetime of the FontCollection set through setFontCollection must
650da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang// extend through the lifetime of the Layout object.
660da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Changclass Layout {
670da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Changpublic:
680da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    void dump() const;
690da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang    void setFontCollection(const FontCollection* collection);
709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // deprecated - missing functionality
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void doLayout(const uint16_t* buf, size_t nchars);
739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void doLayout(const uint16_t* buf, size_t start, size_t count, size_t bufSize,
759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        const std::string& css);
76462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
77462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    void draw(Bitmap*, int x0, int y0, float size) const;
789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // deprecated - pass as argument to doLayout instead
809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void setProperties(const std::string& css);
819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
82462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    // This must be called before any invocations.
839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao	// TODO: probably have a factory instead
849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    static void init();
859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // public accessors
879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    size_t nGlyphs() const;
88a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    // Does not bump reference; ownership is still layout
89a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    MinikinFont *getFont(int i) const;
90a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    unsigned int getGlyphId(int i) const;
91a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    float getX(int i) const;
92a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    float getY(int i) const;
93a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
94a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    float getAdvance() const;
95a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang
96462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    // Get advances, copying into caller-provided buffer. The size of this
97a65ec168e41e3ee9c6e8ac04cde694bbbfc2590aZonr Chang    // buffer must match the length of the string (nchars arg to doLayout).
989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void getAdvances(float* advances);
999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void getBounds(MinikinRect* rect);
1019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liaoprivate:
1039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Find a face in the mFaces vector, or create a new entry
1049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    int findFace(MinikinFont* face, LayoutContext* ctx);
1059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Lay out a single bidi run
1076315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    void doLayoutRunCached(const uint16_t* buf, size_t start, size_t count, size_t bufSize,
1089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        bool isRtl, LayoutContext* ctx, size_t dstStart);
1099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Lay out a single word
1119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void doLayoutWord(const uint16_t* buf, size_t start, size_t count, size_t bufSize,
1129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        bool isRtl, LayoutContext* ctx, size_t bufStart);
1139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // Lay out a single bidi run
1159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void doLayoutRun(const uint16_t* buf, size_t start, size_t count, size_t bufSize,
1169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao        bool isRtl, LayoutContext* ctx);
1179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
118462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    // Append another layout (for example, cached value) into this one
1199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    void appendLayout(Layout* src, size_t start);
1209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    // deprecated - remove when setProperties is removed
1229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::string mCssString;
1239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1246315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    std::vector<LayoutGlyph> mGlyphs;
1259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::vector<float> mAdvances;
1269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    const FontCollection* mCollection;
1289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    std::vector<MinikinFont *> mFaces;
1299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    float mAdvance;
1309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    MinikinRect mBounds;
1319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao};
1329ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1339ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}  // namespace android
1349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
1359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#endif  // MINIKIN_LAYOUT_H
1369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao