blob: a49fa337a96cee5d82806de9e7f379c028f40f99 [file] [log] [blame]
reed@google.comac10a2d2010-12-22 21:39:39 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * 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.
reed@google.comac10a2d2010-12-22 21:39:39 +00006 */
7
reed@google.comac10a2d2010-12-22 21:39:39 +00008#ifndef GrGlyph_DEFINED
9#define GrGlyph_DEFINED
10
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/gpu/GrTypes.h"
12#include "src/gpu/GrDrawOpAtlas.h"
Michael Ludwig663afe52019-06-03 16:46:19 -040013#include "src/gpu/geometry/GrRect.h"
jvanverth294c3262014-10-10 11:36:12 -070014
Mike Kleinc0bd9f92019-04-23 12:05:21 -050015#include "include/core/SkPath.h"
16#include "include/private/SkChecksum.h"
17#include "include/private/SkFixed.h"
reed@google.comac10a2d2010-12-22 21:39:39 +000018
reed@google.comac10a2d2010-12-22 21:39:39 +000019struct GrGlyph {
jvanvertha7634612015-03-19 06:08:31 -070020 enum MaskStyle {
21 kCoverage_MaskStyle,
22 kDistance_MaskStyle
23 };
mtklein852f15d2016-03-17 10:51:27 -070024
Herb Derbya4eecd82019-06-25 15:05:30 -040025 static GrMaskFormat FormatFromSkGlyph(SkMask::Format format) {
26 switch (format) {
Herb Derby5a3fdee2018-12-20 14:47:03 -050027 case SkMask::kBW_Format:
28 case SkMask::kSDF_Format:
29 // fall through to kA8 -- we store BW and SDF glyphs in our 8-bit cache
30 case SkMask::kA8_Format:
31 return kA8_GrMaskFormat;
32 case SkMask::k3D_Format:
33 return kA8_GrMaskFormat; // ignore the mul and add planes, just use the mask
34 case SkMask::kLCD16_Format:
35 return kA565_GrMaskFormat;
36 case SkMask::kARGB32_Format:
37 return kARGB_GrMaskFormat;
38 default:
39 SkDEBUGFAIL("unsupported SkMask::Format");
40 return kA8_GrMaskFormat;
41 }
reed@google.comac10a2d2010-12-22 21:39:39 +000042 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000043
Herb Derby5a3fdee2018-12-20 14:47:03 -050044 static MaskStyle MaskStyleFromSkGlyph(const SkGlyph& skGlyph) {
Herb Derby37216882019-06-13 17:24:24 -040045 return skGlyph.maskFormat() == SkMask::kSDF_Format
Herb Derby5a3fdee2018-12-20 14:47:03 -050046 ? GrGlyph::MaskStyle::kDistance_MaskStyle
47 : GrGlyph::MaskStyle::kCoverage_MaskStyle;
48 }
49
50 GrGlyph(const SkGlyph& skGlyph)
51 : fPackedID{skGlyph.getPackedID()}
Herb Derbya4eecd82019-06-25 15:05:30 -040052 , fMaskFormat{FormatFromSkGlyph(skGlyph.maskFormat())}
Herb Derby5a3fdee2018-12-20 14:47:03 -050053 , fMaskStyle{MaskStyleFromSkGlyph(skGlyph)}
Herb Derby3e8e34e2019-06-20 15:16:13 -040054 , fBounds{GrIRect16::Make(skGlyph.iRect())} {}
Herb Derby5a3fdee2018-12-20 14:47:03 -050055
Herb Derby438ea542018-12-19 18:25:11 -050056
57 SkRect destRect(SkPoint origin) {
58 return SkRect::MakeXYWH(
59 SkIntToScalar(fBounds.fLeft) + origin.x(),
60 SkIntToScalar(fBounds.fTop) + origin.y(),
61 SkIntToScalar(fBounds.width()),
62 SkIntToScalar(fBounds.height()));
63 }
64
65 SkRect destRect(SkPoint origin, SkScalar textScale) {
66 if (fMaskStyle == kCoverage_MaskStyle) {
67 return SkRect::MakeXYWH(
68 SkIntToScalar(fBounds.fLeft) * textScale + origin.x(),
69 SkIntToScalar(fBounds.fTop) * textScale + origin.y(),
70 SkIntToScalar(fBounds.width()) * textScale,
71 SkIntToScalar(fBounds.height()) * textScale);
72 } else {
73 return SkRect::MakeXYWH(
74 (SkIntToScalar(fBounds.fLeft) + SK_DistanceFieldInset) * textScale + origin.x(),
75 (SkIntToScalar(fBounds.fTop) + SK_DistanceFieldInset) * textScale + origin.y(),
76 (SkIntToScalar(fBounds.width()) - 2 * SK_DistanceFieldInset) * textScale,
77 (SkIntToScalar(fBounds.height()) - 2 * SK_DistanceFieldInset) * textScale);
78 }
79 }
Herb Derbyb03e0242018-12-20 13:19:44 -050080
reed@google.comac10a2d2010-12-22 21:39:39 +000081 int width() const { return fBounds.width(); }
82 int height() const { return fBounds.height(); }
Herb Derby4d721712020-01-24 14:31:16 -050083 uint32_t pageIndex() const { return GrDrawOpAtlas::GetPageIndexFromID(fPlotLocator); }
Herb Derby37e21f62018-12-19 19:56:02 -050084 MaskStyle maskStyle() const { return fMaskStyle; }
reed@google.comac10a2d2010-12-22 21:39:39 +000085
Herb Derby4d721712020-01-24 14:31:16 -050086 const SkPackedGlyphID fPackedID;
87 const GrMaskFormat fMaskFormat;
88 const MaskStyle fMaskStyle;
89 const GrIRect16 fBounds;
90 SkIPoint16 fAtlasLocation{0, 0};
91 GrDrawOpAtlas::PlotLocator fPlotLocator{GrDrawOpAtlas::kInvalidPlotLocator};
jvanverthdd6d2272014-07-22 13:25:26 -070092};
reed@google.comac10a2d2010-12-22 21:39:39 +000093
94#endif