151daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman/*
251daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman * Copyright 2014 Google Inc.
351daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman *
451daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman * Use of this source code is governed by a BSD-style license that can be
551daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman * found in the LICENSE file.
651daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman */
751daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman
851daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman#ifndef SkScalarContext_win_dw_DEFINED
951daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman#define SkScalarContext_win_dw_DEFINED
1051daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman
1151daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman#include "SkScalar.h"
1251daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman#include "SkScalerContext.h"
1351daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman#include "SkTypeface_win_dw.h"
1451daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman#include "SkTypes.h"
1551daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman
1651daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman#include <dwrite.h>
1773c7c3c2346033e0b5df123f1a6b488015443a55bungeman#include <dwrite_2.h>
1851daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman
19b69d0e0ac45e13f667bc11a937dcb547072bc93dherbclass SkGlyph;
2051daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungemanclass SkDescriptor;
2151daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman
2251daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungemanclass SkScalerContext_DW : public SkScalerContext {
2351daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungemanpublic:
247cfd46aebda7b7d2b88e73621ed0d1be7244c2cabungeman    SkScalerContext_DW(sk_sp<DWriteFontTypeface>,
257cfd46aebda7b7d2b88e73621ed0d1be7244c2cabungeman                       const SkScalerContextEffects&,
267cfd46aebda7b7d2b88e73621ed0d1be7244c2cabungeman                       const SkDescriptor*);
271ef80942b3b2414c862eb1e9ae301442b447c089Chris Dalton    ~SkScalerContext_DW() override;
2851daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman
2951daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungemanprotected:
3036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    unsigned generateGlyphCount() override;
3136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    uint16_t generateCharToGlyph(SkUnichar uni) override;
3236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void generateAdvance(SkGlyph* glyph) override;
3336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void generateMetrics(SkGlyph* glyph) override;
3436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void generateImage(const SkGlyph& glyph) override;
356e9ac12495f3b64b6ea8860bb9f99c43cd33aa08Ben Wagner    void generatePath(SkGlyphID glyph, SkPath* path) override;
3636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void generateFontMetrics(SkPaint::FontMetrics*) override;
3751daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman
3851daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungemanprivate:
39b2f7fce9e034c3b6749e75a129e7836df3529706Ben Wagner    const void* drawDWMask(const SkGlyph& glyph,
40b2f7fce9e034c3b6749e75a129e7836df3529706Ben Wagner                           DWRITE_RENDERING_MODE renderingMode,
41b2f7fce9e034c3b6749e75a129e7836df3529706Ben Wagner                           DWRITE_TEXTURE_TYPE textureType);
42b2f7fce9e034c3b6749e75a129e7836df3529706Ben Wagner
43683a37692bc67ef1144922b73a1e871e7e1e842ebungeman    HRESULT getBoundingBox(SkGlyph* glyph,
44683a37692bc67ef1144922b73a1e871e7e1e842ebungeman                           DWRITE_RENDERING_MODE renderingMode,
45683a37692bc67ef1144922b73a1e871e7e1e842ebungeman                           DWRITE_TEXTURE_TYPE textureType,
46683a37692bc67ef1144922b73a1e871e7e1e842ebungeman                           RECT* bbox);
4751daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman
48c4b091543b4082fd1a2f356ef3b478073c5f9418kulshin    bool isColorGlyph(const SkGlyph& glyph);
49c4b091543b4082fd1a2f356ef3b478073c5f9418kulshin
507cfd46aebda7b7d2b88e73621ed0d1be7244c2cabungeman    DWriteFontTypeface* getDWriteTypeface() {
517cfd46aebda7b7d2b88e73621ed0d1be7244c2cabungeman        return static_cast<DWriteFontTypeface*>(this->getTypeface());
527cfd46aebda7b7d2b88e73621ed0d1be7244c2cabungeman    }
537cfd46aebda7b7d2b88e73621ed0d1be7244c2cabungeman
54c4b091543b4082fd1a2f356ef3b478073c5f9418kulshin    bool getColorGlyphRun(const SkGlyph& glyph, IDWriteColorGlyphRunEnumerator** colorGlyph);
55c4b091543b4082fd1a2f356ef3b478073c5f9418kulshin
56c4b091543b4082fd1a2f356ef3b478073c5f9418kulshin    void generateColorGlyphImage(const SkGlyph& glyph);
57c4b091543b4082fd1a2f356ef3b478073c5f9418kulshin
5851daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman    SkTDArray<uint8_t> fBits;
5951daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman    /** The total matrix without the text height scale. */
6051daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman    SkMatrix fSkXform;
6151daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman    /** The total matrix without the text height scale. */
6251daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman    DWRITE_MATRIX fXform;
6351daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman    /** The text size to render with. */
6451daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman    SkScalar fTextSizeRender;
6551daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman    /** The text size to measure with. */
6651daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman    SkScalar fTextSizeMeasure;
6751daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman    int fGlyphCount;
6851daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman    DWRITE_RENDERING_MODE fRenderingMode;
6951daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman    DWRITE_TEXTURE_TYPE fTextureType;
7051daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman    DWRITE_MEASURING_MODE fMeasuringMode;
7122253064ceee1dd9fcd26b7d6d69505cba76bb33Ben Wagner    DWRITE_TEXT_ANTIALIAS_MODE fAntiAliasMode;
7222253064ceee1dd9fcd26b7d6d69505cba76bb33Ben Wagner    DWRITE_GRID_FIT_MODE fGridFitMode;
73bd770d619553a88eeaa64ff29082f62db5c9b4d2bungeman    bool fIsColorFont;
7451daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman};
7551daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman
7651daa25a2b16bca578e78b7ea1e5815b9abb8b0bbungeman#endif
77