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 GrFontScaler_DEFINED
9 #define GrFontScaler_DEFINED
10 
11 #include "GrGlyph.h"
12 #include "GrTypes.h"
13 
14 #include "SkDescriptor.h"
15 
16 class SkGlyph;
17 class SkPath;
18 
19 /*
20  *  Wrapper class to turn a font cache descriptor into a key
21  *  for GrFontScaler-related lookups
22  */
23 class GrFontDescKey : public SkRefCnt {
24 public:
GrFontDescKey(const SkDescriptor & desc)25     explicit GrFontDescKey(const SkDescriptor& desc) : fDesc(desc), fHash(desc.getChecksum()) {}
26 
getHash()27     uint32_t getHash() const { return fHash; }
28 
29     bool operator==(const GrFontDescKey& rh) const {
30         return fHash == rh.fHash && fDesc.getDesc()->equals(*rh.fDesc.getDesc());
31     }
32 
33 private:
34     SkAutoDescriptor fDesc;
35     uint32_t fHash;
36 
37     typedef SkRefCnt INHERITED;
38 };
39 
40 /*
41  *  This is Gr's interface to the host platform's font scaler.
42  *
43  *  The client is responsible for instantiating this. The instance is created
44  *  for a specific font+size+matrix.
45  */
46 class GrFontScaler : public SkRefCnt {
47 public:
48     explicit GrFontScaler(SkGlyphCache* strike);
49     virtual ~GrFontScaler();
50 
51     const GrFontDescKey* getKey();
52     GrMaskFormat getMaskFormat() const;
53     GrMaskFormat getPackedGlyphMaskFormat(const SkGlyph&) const;
54     bool getPackedGlyphBounds(const SkGlyph&, SkIRect* bounds);
55     bool getPackedGlyphImage(const SkGlyph&, int width, int height, int rowBytes,
56                              GrMaskFormat expectedMaskFormat, void* image);
57     bool getPackedGlyphDFBounds(const SkGlyph&, SkIRect* bounds);
58     bool getPackedGlyphDFImage(const SkGlyph&, int width, int height, void* image);
59     const SkPath* getGlyphPath(const SkGlyph&);
60     const SkGlyph& grToSkGlyph(GrGlyph::PackedID);
61 
62 private:
63     SkGlyphCache*  fStrike;
64     GrFontDescKey* fKey;
65 
66     typedef SkRefCnt INHERITED;
67 };
68 
69 #endif
70