1/*
2 * Copyright 2014 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 SkScalarContext_win_dw_DEFINED
9#define SkScalarContext_win_dw_DEFINED
10
11#include "SkScalar.h"
12#include "SkScalerContext.h"
13#include "SkTypeface_win_dw.h"
14#include "SkTypes.h"
15
16#include <dwrite.h>
17
18struct SkGlyph;
19class SkDescriptor;
20
21class SkScalerContext_DW : public SkScalerContext {
22public:
23    SkScalerContext_DW(DWriteFontTypeface*, const SkDescriptor* desc);
24    virtual ~SkScalerContext_DW();
25
26protected:
27    virtual unsigned generateGlyphCount() SK_OVERRIDE;
28    virtual uint16_t generateCharToGlyph(SkUnichar uni) SK_OVERRIDE;
29    virtual void generateAdvance(SkGlyph* glyph) SK_OVERRIDE;
30    virtual void generateMetrics(SkGlyph* glyph) SK_OVERRIDE;
31    virtual void generateImage(const SkGlyph& glyph) SK_OVERRIDE;
32    virtual void generatePath(const SkGlyph& glyph, SkPath* path) SK_OVERRIDE;
33    virtual void generateFontMetrics(SkPaint::FontMetrics*) SK_OVERRIDE;
34
35private:
36    const void* drawDWMask(const SkGlyph& glyph,
37                           DWRITE_RENDERING_MODE renderingMode,
38                           DWRITE_TEXTURE_TYPE textureType);
39
40    HRESULT getBoundingBox(SkGlyph* glyph,
41                           DWRITE_RENDERING_MODE renderingMode,
42                           DWRITE_TEXTURE_TYPE textureType,
43                           RECT* bbox);
44
45    SkTDArray<uint8_t> fBits;
46    /** The total matrix without the text height scale. */
47    SkMatrix fSkXform;
48    /** The total matrix without the text height scale. */
49    DWRITE_MATRIX fXform;
50    /** The non-rotational part of total matrix without the text height scale.
51     *  This is used to find the magnitude of gdi compatible advances.
52     */
53    DWRITE_MATRIX fGsA;
54    /** The inverse of the rotational part of the total matrix.
55     *  This is used to find the direction of gdi compatible advances.
56     */
57    SkMatrix fG_inv;
58    /** The text size to render with. */
59    SkScalar fTextSizeRender;
60    /** The text size to measure with. */
61    SkScalar fTextSizeMeasure;
62    SkAutoTUnref<DWriteFontTypeface> fTypeface;
63    int fGlyphCount;
64    DWRITE_RENDERING_MODE fRenderingMode;
65    DWRITE_TEXTURE_TYPE fTextureType;
66    DWRITE_MEASURING_MODE fMeasuringMode;
67};
68
69#endif
70