• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "Paint.h"
18 #include "BlurDrawLooper.h"
19 
20 namespace android {
21 
Paint()22 Paint::Paint()
23         : SkPaint()
24         , mLetterSpacing(0)
25         , mWordSpacing(0)
26         , mFontFeatureSettings()
27         , mMinikinLocaleListId(0)
28         , mFamilyVariant(minikin::FamilyVariant::DEFAULT) {
29     // SkPaint::antialiasing defaults to false, but
30     // SkFont::edging defaults to kAntiAlias. To keep them
31     // insync, we manually set the font to kAilas.
32     mFont.setEdging(SkFont::Edging::kAlias);
33 }
34 
Paint(const Paint & paint)35 Paint::Paint(const Paint& paint)
36         : SkPaint(paint)
37         , mFont(paint.mFont)
38         , mLooper(paint.mLooper)
39         , mLetterSpacing(paint.mLetterSpacing)
40         , mWordSpacing(paint.mWordSpacing)
41         , mFontFeatureSettings(paint.mFontFeatureSettings)
42         , mMinikinLocaleListId(paint.mMinikinLocaleListId)
43         , mFamilyVariant(paint.mFamilyVariant)
44         , mHyphenEdit(paint.mHyphenEdit)
45         , mTypeface(paint.mTypeface)
46         , mAlign(paint.mAlign)
47         , mFilterBitmap(paint.mFilterBitmap)
48         , mStrikeThru(paint.mStrikeThru)
49         , mUnderline(paint.mUnderline)
50         , mDevKern(paint.mDevKern) {}
51 
52 
~Paint()53 Paint::~Paint() {}
54 
operator =(const Paint & other)55 Paint& Paint::operator=(const Paint& other) {
56     SkPaint::operator=(other);
57     mFont = other.mFont;
58     mLooper = other.mLooper;
59     mLetterSpacing = other.mLetterSpacing;
60     mWordSpacing = other.mWordSpacing;
61     mFontFeatureSettings = other.mFontFeatureSettings;
62     mMinikinLocaleListId = other.mMinikinLocaleListId;
63     mFamilyVariant = other.mFamilyVariant;
64     mHyphenEdit = other.mHyphenEdit;
65     mTypeface = other.mTypeface;
66     mAlign = other.mAlign;
67     mFilterBitmap = other.mFilterBitmap;
68     mStrikeThru = other.mStrikeThru;
69     mUnderline = other.mUnderline;
70     mDevKern = other.mDevKern;
71     return *this;
72 }
73 
operator ==(const Paint & a,const Paint & b)74 bool operator==(const Paint& a, const Paint& b) {
75     return static_cast<const SkPaint&>(a) == static_cast<const SkPaint&>(b) &&
76            a.mFont == b.mFont &&
77            a.mLooper == b.mLooper &&
78            a.mLetterSpacing == b.mLetterSpacing && a.mWordSpacing == b.mWordSpacing &&
79            a.mFontFeatureSettings == b.mFontFeatureSettings &&
80            a.mMinikinLocaleListId == b.mMinikinLocaleListId &&
81            a.mFamilyVariant == b.mFamilyVariant && a.mHyphenEdit == b.mHyphenEdit &&
82            a.mTypeface == b.mTypeface && a.mAlign == b.mAlign &&
83            a.mFilterBitmap == b.mFilterBitmap &&
84            a.mStrikeThru == b.mStrikeThru && a.mUnderline == b.mUnderline &&
85            a.mDevKern == b.mDevKern;
86 }
87 
reset()88 void Paint::reset() {
89     SkPaint::reset();
90 
91     mFont = SkFont();
92     mFont.setEdging(SkFont::Edging::kAlias);
93     mLooper.reset();
94 
95     mFilterBitmap = false;
96     mStrikeThru = false;
97     mUnderline = false;
98     mDevKern = false;
99 }
100 
setLooper(sk_sp<BlurDrawLooper> looper)101 void Paint::setLooper(sk_sp<BlurDrawLooper> looper) {
102     mLooper = std::move(looper);
103 }
104 
setAntiAlias(bool aa)105 void Paint::setAntiAlias(bool aa) {
106     // Java does not support/understand subpixel(lcd) antialiasing
107     SkASSERT(mFont.getEdging() != SkFont::Edging::kSubpixelAntiAlias);
108     // JavaPaint antialiasing affects both the SkPaint and SkFont settings.
109     SkPaint::setAntiAlias(aa);
110     mFont.setEdging(aa ? SkFont::Edging::kAntiAlias : SkFont::Edging::kAlias);
111 }
112 
113 ////////////////// Java flags compatibility //////////////////
114 
115 /*  Flags are tricky. Java has its own idea of the "paint" flags, but they don't really
116     match up with skia anymore, so we have to do some shuffling in get/set flags()
117 
118 	3 flags apply to SkPaint (antialias, dither, filter -> enum)
119     5 flags (merged with antialias) are for SkFont
120     2 flags are for minikin::Paint (underline and strikethru)
121 */
122 
123 // flags relating to SkPaint
124 static const uint32_t sAntiAliasFlag    = 0x01;   // affects paint and font-edging
125 static const uint32_t sFilterBitmapFlag = 0x02;   // maps to enum
126 static const uint32_t sDitherFlag       = 0x04;
127 // flags relating to SkFont
128 static const uint32_t sFakeBoldFlag     = 0x020;
129 static const uint32_t sLinearMetrics    = 0x040;
130 static const uint32_t sSubpixelMetrics  = 0x080;
131 static const uint32_t sEmbeddedBitmaps  = 0x400;
132 static const uint32_t sForceAutoHinting = 0x800;
133 // flags related to minikin::Paint
134 static const uint32_t sUnderlineFlag    = 0x08;
135 static const uint32_t sStrikeThruFlag   = 0x10;
136 // flags no longer supported on native side (but mirrored for compatibility)
137 static const uint32_t sDevKernFlag      = 0x100;
138 
paintToLegacyFlags(const SkPaint & paint)139 static uint32_t paintToLegacyFlags(const SkPaint& paint) {
140     uint32_t flags = 0;
141     flags |= -(int)paint.isAntiAlias() & sAntiAliasFlag;
142     flags |= -(int)paint.isDither()    & sDitherFlag;
143     return flags;
144 }
145 
fontToLegacyFlags(const SkFont & font)146 static uint32_t fontToLegacyFlags(const SkFont& font) {
147     uint32_t flags = 0;
148     flags |= -(int)font.isEmbolden()         & sFakeBoldFlag;
149     flags |= -(int)font.isLinearMetrics()    & sLinearMetrics;
150     flags |= -(int)font.isSubpixel()         & sSubpixelMetrics;
151     flags |= -(int)font.isEmbeddedBitmaps()  & sEmbeddedBitmaps;
152     flags |= -(int)font.isForceAutoHinting() & sForceAutoHinting;
153     return flags;
154 }
155 
applyLegacyFlagsToPaint(uint32_t flags,SkPaint * paint)156 static void applyLegacyFlagsToPaint(uint32_t flags, SkPaint* paint) {
157     paint->setAntiAlias((flags & sAntiAliasFlag) != 0);
158     paint->setDither   ((flags & sDitherFlag) != 0);
159 }
160 
applyLegacyFlagsToFont(uint32_t flags,SkFont * font)161 static void applyLegacyFlagsToFont(uint32_t flags, SkFont* font) {
162     font->setEmbolden        ((flags & sFakeBoldFlag) != 0);
163     font->setLinearMetrics   ((flags & sLinearMetrics) != 0);
164     font->setSubpixel        ((flags & sSubpixelMetrics) != 0);
165     font->setEmbeddedBitmaps ((flags & sEmbeddedBitmaps) != 0);
166     font->setForceAutoHinting((flags & sForceAutoHinting) != 0);
167 
168     if (flags & sAntiAliasFlag) {
169         font->setEdging(SkFont::Edging::kAntiAlias);
170     } else {
171         font->setEdging(SkFont::Edging::kAlias);
172     }
173 }
174 
GetSkPaintJavaFlags(const SkPaint & paint)175 uint32_t Paint::GetSkPaintJavaFlags(const SkPaint& paint) {
176     return paintToLegacyFlags(paint);
177 }
178 
SetSkPaintJavaFlags(SkPaint * paint,uint32_t flags)179 void Paint::SetSkPaintJavaFlags(SkPaint* paint, uint32_t flags) {
180     applyLegacyFlagsToPaint(flags, paint);
181 }
182 
getJavaFlags() const183 uint32_t Paint::getJavaFlags() const {
184     uint32_t flags = paintToLegacyFlags(*this) | fontToLegacyFlags(mFont);
185     flags |= -(int)mStrikeThru   & sStrikeThruFlag;
186     flags |= -(int)mUnderline    & sUnderlineFlag;
187     flags |= -(int)mDevKern      & sDevKernFlag;
188     flags |= -(int)mFilterBitmap & sFilterBitmapFlag;
189     return flags;
190 }
191 
setJavaFlags(uint32_t flags)192 void Paint::setJavaFlags(uint32_t flags) {
193     applyLegacyFlagsToPaint(flags, this);
194     applyLegacyFlagsToFont(flags, &mFont);
195     mStrikeThru   = (flags & sStrikeThruFlag) != 0;
196     mUnderline    = (flags & sUnderlineFlag) != 0;
197     mDevKern      = (flags & sDevKernFlag) != 0;
198     mFilterBitmap = (flags & sFilterBitmapFlag) != 0;
199 }
200 
201 }  // namespace android
202