blob: db1bf27cef0bca30a62c065c28b5fe79bdf7f912 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@google.comac10a2d2010-12-22 21:39:39 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2010 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
reed@google.comac10a2d2010-12-22 21:39:39 +00007 */
8
9
epoger@google.comec3ed6a2011-07-28 14:26:00 +000010
reed@google.comac10a2d2010-12-22 21:39:39 +000011#ifndef GrTextStrike_impl_DEFINED
12#define GrTextStrike_impl_DEFINED
13
reed@google.comac10a2d2010-12-22 21:39:39 +000014void GrFontCache::detachStrikeFromList(GrTextStrike* strike) {
15 if (strike->fPrev) {
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +000016 SkASSERT(fHead != strike);
reed@google.comac10a2d2010-12-22 21:39:39 +000017 strike->fPrev->fNext = strike->fNext;
18 } else {
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +000019 SkASSERT(fHead == strike);
reed@google.comac10a2d2010-12-22 21:39:39 +000020 fHead = strike->fNext;
21 }
22
23 if (strike->fNext) {
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +000024 SkASSERT(fTail != strike);
reed@google.comac10a2d2010-12-22 21:39:39 +000025 strike->fNext->fPrev = strike->fPrev;
26 } else {
tfarina@chromium.orgf6de4752013-08-17 00:02:59 +000027 SkASSERT(fTail == strike);
reed@google.comac10a2d2010-12-22 21:39:39 +000028 fTail = strike->fPrev;
29 }
30}
31
jvanverth@google.comd830d132013-11-11 20:54:09 +000032GrTextStrike* GrFontCache::getStrike(GrFontScaler* scaler, bool useDistanceField) {
reed@google.comac10a2d2010-12-22 21:39:39 +000033 this->validate();
rmistry@google.comd6176b02012-08-23 18:14:13 +000034
jvanverthdd6d2272014-07-22 13:25:26 -070035 GrTextStrike* strike = fCache.find(*(scaler->getKey()));
reed@google.comac10a2d2010-12-22 21:39:39 +000036 if (NULL == strike) {
jvanverthdd6d2272014-07-22 13:25:26 -070037 strike = this->generateStrike(scaler);
reed@google.comac10a2d2010-12-22 21:39:39 +000038 } else if (strike->fPrev) {
39 // Need to put the strike at the head of its dllist, since that is how
commit-bot@chromium.org53e1e4d2014-04-01 16:25:11 +000040 // we age the strikes for purging (we purge from the back of the list)
reed@google.comac10a2d2010-12-22 21:39:39 +000041 this->detachStrikeFromList(strike);
42 // attach at the head
43 fHead->fPrev = strike;
44 strike->fNext = fHead;
45 strike->fPrev = NULL;
46 fHead = strike;
47 }
jvanverth@google.comd830d132013-11-11 20:54:09 +000048 strike->fUseDistanceField = useDistanceField;
reed@google.comac10a2d2010-12-22 21:39:39 +000049 this->validate();
50 return strike;
51}
52
53///////////////////////////////////////////////////////////////////////////////
54
reed@google.comac10a2d2010-12-22 21:39:39 +000055GrGlyph* GrTextStrike::getGlyph(GrGlyph::PackedID packed,
56 GrFontScaler* scaler) {
57 GrGlyph* glyph = fCache.find(packed);
58 if (NULL == glyph) {
59 glyph = this->generateGlyph(packed, scaler);
60 }
61 return glyph;
62}
63
64#endif