1/*
2 * Copyright 2010 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 GrGlyph_DEFINED
9#define GrGlyph_DEFINED
10
11#include "GrRect.h"
12#include "SkPath.h"
13
14class GrPlot;
15
16/*  Need this to be quad-state:
17    - complete w/ image
18    - just metrics
19    - failed to get image, but has metrics
20    - failed to get metrics
21 */
22struct GrGlyph {
23    typedef uint32_t PackedID;
24
25    GrPlot*     fPlot;
26    SkPath*     fPath;
27    PackedID    fPackedID;
28    GrIRect16   fBounds;
29    SkIPoint16  fAtlasLocation;
30
31    void init(GrGlyph::PackedID packed, const SkIRect& bounds) {
32        fPlot = NULL;
33        fPath = NULL;
34        fPackedID = packed;
35        fBounds.set(bounds);
36        fAtlasLocation.set(0, 0);
37    }
38
39    void free() {
40        if (fPath) {
41            delete fPath;
42            fPath = NULL;
43        }
44    }
45
46    int width() const { return fBounds.width(); }
47    int height() const { return fBounds.height(); }
48    bool isEmpty() const { return fBounds.isEmpty(); }
49    uint16_t glyphID() const { return UnpackID(fPackedID); }
50
51    ///////////////////////////////////////////////////////////////////////////
52
53    static inline unsigned ExtractSubPixelBitsFromFixed(SkFixed pos) {
54        // two most significant fraction bits from fixed-point
55        return (pos >> 14) & 3;
56    }
57
58    static inline PackedID Pack(uint16_t glyphID, SkFixed x, SkFixed y) {
59        x = ExtractSubPixelBitsFromFixed(x);
60        y = ExtractSubPixelBitsFromFixed(y);
61        return (x << 18) | (y << 16) | glyphID;
62    }
63
64    static inline SkFixed UnpackFixedX(PackedID packed) {
65        return ((packed >> 18) & 3) << 14;
66    }
67
68    static inline SkFixed UnpackFixedY(PackedID packed) {
69        return ((packed >> 16) & 3) << 14;
70    }
71
72    static inline uint16_t UnpackID(PackedID packed) {
73        return (uint16_t)packed;
74    }
75};
76
77
78#endif
79