GrTextStrike.cpp revision f8cb184095946ebf8f183d253e27bd544a19f23c
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2010 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */
7ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
8ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrAtlas.h"
9ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrGpu.h"
10ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrRectanizer.h"
11ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrTextStrike.h"
12ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrTextStrike_impl.h"
1303e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org#include "SkString.h"
14ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
15d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#if SK_DISTANCEFIELD_FONTS
16d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#include "edtaa3.h"
17d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#endif
18d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
19fa35e3ddcc9d130ce87c927218bdf27879c38711reed@google.comSK_DEFINE_INST_COUNT(GrFontScaler)
20fa35e3ddcc9d130ce87c927218bdf27879c38711reed@google.comSK_DEFINE_INST_COUNT(GrKey)
21fa35e3ddcc9d130ce87c927218bdf27879c38711reed@google.com
22fa35e3ddcc9d130ce87c927218bdf27879c38711reed@google.com///////////////////////////////////////////////////////////////////////////////
23fa35e3ddcc9d130ce87c927218bdf27879c38711reed@google.com
2467ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org#define FONT_CACHE_STATS 0
2567ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org#if FONT_CACHE_STATS
2667ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.orgstatic int g_PurgeCount = 0;
2767ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org#endif
2867ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org
29ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrFontCache::GrFontCache(GrGpu* gpu) : fGpu(gpu) {
30ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    gpu->ref();
31f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org    for (int i = 0; i < kAtlasCount; ++i) {
323fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org        fAtlasMgr[i] = NULL;
333fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org    }
34ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
35ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    fHead = fTail = NULL;
36ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
37ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
38ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrFontCache::~GrFontCache() {
39ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    fCache.deleteAll();
40f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org    for (int i = 0; i < kAtlasCount; ++i) {
413fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org        delete fAtlasMgr[i];
423fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org    }
43ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    fGpu->unref();
4467ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org#if FONT_CACHE_STATS
4567ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org      GrPrintf("Num purges: %d\n", g_PurgeCount);
4667ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org#endif
47ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
48ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
49952944144758dd3f9a8a010ec1d99cb4bd035ae4commit-bot@chromium.orgstatic GrPixelConfig mask_format_to_pixel_config(GrMaskFormat format) {
50f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org    static const GrPixelConfig sPixelConfigs[] = {
51f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org        kAlpha_8_GrPixelConfig,
52f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org        kRGB_565_GrPixelConfig,
53f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org        kSkia8888_GrPixelConfig,
54f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org        kSkia8888_GrPixelConfig
55f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org    };
56f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org    SK_COMPILE_ASSERT(SK_ARRAY_COUNT(sPixelConfigs) == kMaskFormatCount, array_size_mismatch);
57f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org
58f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org    return sPixelConfigs[format];
59f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org}
60f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org
61f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.orgstatic int mask_format_to_atlas_index(GrMaskFormat format) {
62f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org    static const int sAtlasIndices[] = {
63f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org        GrFontCache::kA8_AtlasType,
64f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org        GrFontCache::k565_AtlasType,
65f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org        GrFontCache::k8888_AtlasType,
66f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org        GrFontCache::k8888_AtlasType
67f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org    };
68f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org    SK_COMPILE_ASSERT(SK_ARRAY_COUNT(sAtlasIndices) == kMaskFormatCount, array_size_mismatch);
69f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org
70f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org    SkASSERT(sAtlasIndices[format] < GrFontCache::kAtlasCount);
71f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org    return sAtlasIndices[format];
72952944144758dd3f9a8a010ec1d99cb4bd035ae4commit-bot@chromium.org}
73952944144758dd3f9a8a010ec1d99cb4bd035ae4commit-bot@chromium.org
74ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrTextStrike* GrFontCache::generateStrike(GrFontScaler* scaler,
75ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                          const Key& key) {
763fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org    GrMaskFormat format = scaler->getMaskFormat();
77952944144758dd3f9a8a010ec1d99cb4bd035ae4commit-bot@chromium.org    GrPixelConfig config = mask_format_to_pixel_config(format);
78f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org    int atlasIndex = mask_format_to_atlas_index(format);
79f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org    if (NULL == fAtlasMgr[atlasIndex]) {
80f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org        fAtlasMgr[atlasIndex] = SkNEW_ARGS(GrAtlasMgr, (fGpu, config));
81ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
82c377baf406996aed18d82d328029c82dbc3b8ddatomhudson@google.com    GrTextStrike* strike = SkNEW_ARGS(GrTextStrike,
83f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org                                      (this, scaler->getKey(), format, fAtlasMgr[atlasIndex]));
84ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    fCache.insert(key, strike);
85ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
86ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    if (fHead) {
87ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        fHead->fPrev = strike;
88ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    } else {
89f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org        SkASSERT(NULL == fTail);
90ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        fTail = strike;
91ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
92ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    strike->fPrev = NULL;
93ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    strike->fNext = fHead;
94ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    fHead = strike;
95ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
96ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    return strike;
97ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
98ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
99ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comvoid GrFontCache::freeAll() {
100ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    fCache.deleteAll();
101f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org    for (int i = 0; i < kAtlasCount; ++i) {
1023fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org        delete fAtlasMgr[i];
1033fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org        fAtlasMgr[i] = NULL;
1043fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org    }
1058fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    fHead = NULL;
1068fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com    fTail = NULL;
107ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
108ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
109b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.orgvoid GrFontCache::purgeStrike(GrTextStrike* strike) {
110b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.org    const GrFontCache::Key key(strike->fFontScalerKey);
111b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.org    fCache.remove(key, strike);
112b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.org    this->detachStrikeFromList(strike);
113b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.org    delete strike;
114b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.org}
115b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.org
116ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comvoid GrFontCache::purgeExceptFor(GrTextStrike* preserveStrike) {
117bbe55fdf6608b8aec2e5d3945da6b1872b3a380fjvanverth@google.com    SkASSERT(NULL != preserveStrike);
118ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    GrTextStrike* strike = fTail;
11967ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org    bool purge = true;
120bbe55fdf6608b8aec2e5d3945da6b1872b3a380fjvanverth@google.com    GrMaskFormat maskFormat = preserveStrike->fMaskFormat;
12167ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org    while (strike) {
122bbe55fdf6608b8aec2e5d3945da6b1872b3a380fjvanverth@google.com        if (strike == preserveStrike || maskFormat != strike->fMaskFormat) {
12367ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org            strike = strike->fPrev;
12467ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org            continue;
12567ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org        }
12667ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org        GrTextStrike* strikeToPurge = strike;
12767ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org        strike = strikeToPurge->fPrev;
12867ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org        if (purge) {
12967ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org            // keep purging if we won't free up any atlases with this strike.
1307d330eb19cd3c9278abce68ca0e3efabf2ec8f87commit-bot@chromium.org            purge = strikeToPurge->fAtlas.isEmpty();
131b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.org            this->purgeStrike(strikeToPurge);
13267ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org        }
13367ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org    }
13467ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org#if FONT_CACHE_STATS
13567ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org    ++g_PurgeCount;
13667ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org#endif
13767ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org}
13867ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org
1397d330eb19cd3c9278abce68ca0e3efabf2ec8f87commit-bot@chromium.orgvoid GrFontCache::freePlotExceptFor(GrTextStrike* preserveStrike) {
140bbe55fdf6608b8aec2e5d3945da6b1872b3a380fjvanverth@google.com    SkASSERT(NULL != preserveStrike);
14167ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org    GrTextStrike* strike = fTail;
142bbe55fdf6608b8aec2e5d3945da6b1872b3a380fjvanverth@google.com    GrMaskFormat maskFormat = preserveStrike->fMaskFormat;
1437359eae7c6fce8cb88ae28ca7048283b77535db4bsalomon@google.com    while (strike) {
144bbe55fdf6608b8aec2e5d3945da6b1872b3a380fjvanverth@google.com        if (strike == preserveStrike || maskFormat != strike->fMaskFormat) {
1457359eae7c6fce8cb88ae28ca7048283b77535db4bsalomon@google.com            strike = strike->fPrev;
1467359eae7c6fce8cb88ae28ca7048283b77535db4bsalomon@google.com            continue;
1477359eae7c6fce8cb88ae28ca7048283b77535db4bsalomon@google.com        }
1487359eae7c6fce8cb88ae28ca7048283b77535db4bsalomon@google.com        GrTextStrike* strikeToPurge = strike;
14967ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org        strike = strikeToPurge->fPrev;
1507d330eb19cd3c9278abce68ca0e3efabf2ec8f87commit-bot@chromium.org        if (strikeToPurge->removeUnusedPlots()) {
1517d330eb19cd3c9278abce68ca0e3efabf2ec8f87commit-bot@chromium.org            if (strikeToPurge->fAtlas.isEmpty()) {
152b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.org                this->purgeStrike(strikeToPurge);
15367ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org            }
15467ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org            break;
15567ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org        }
156ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
157ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
158ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
159515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG
160ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comvoid GrFontCache::validate() const {
161ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    int count = fCache.count();
162ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    if (0 == count) {
163f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org        SkASSERT(!fHead);
164f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org        SkASSERT(!fTail);
165ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    } else if (1 == count) {
166f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org        SkASSERT(fHead == fTail);
167ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    } else {
168f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org        SkASSERT(fHead != fTail);
169ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
170ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
171ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    int count2 = 0;
172ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    const GrTextStrike* strike = fHead;
173ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    while (strike) {
174ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        count2 += 1;
175ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        strike = strike->fNext;
176ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
177f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org    SkASSERT(count == count2);
178ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
179ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    count2 = 0;
180ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    strike = fTail;
181ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    while (strike) {
182ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        count2 += 1;
183ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        strike = strike->fPrev;
184ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
185f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org    SkASSERT(count == count2);
186ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
187ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif
188ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
18903e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org#ifdef SK_DEVELOPER
19003e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.orgvoid GrFontCache::dump() const {
19103e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org    static int gDumpCount = 0;
192f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org    for (int i = 0; i < kAtlasCount; ++i) {
19303e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org        if (NULL != fAtlasMgr[i]) {
19403e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org            GrTexture* texture = fAtlasMgr[i]->getTexture();
19503e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org            if (NULL != texture) {
19603e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org                SkString filename;
19703e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org                filename.printf("fontcache_%d%d.png", gDumpCount, i);
19803e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org                texture->savePixels(filename.c_str());
19903e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org            }
20003e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org        }
20103e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org    }
20203e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org    ++gDumpCount;
20303e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org}
20403e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org#endif
20503e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org
206ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com///////////////////////////////////////////////////////////////////////////////
207ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
208515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG
209ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    static int gCounter;
210ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif
211ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
212d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#if SK_DISTANCEFIELD_FONTS
213d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#define DISTANCE_FIELD_PAD   4
214d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#define DISTANCE_FIELD_RANGE (4.0)
215d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#endif
216d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
217ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com/*
218ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    The text strike is specific to a given font/style/matrix setup, which is
219ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    represented by the GrHostFontScaler object we are given in getGlyph().
220ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
221ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    We map a 32bit glyphID to a GrGlyph record, which in turn points to a
222ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    atlas and a position within that texture.
223ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */
224ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
225ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrTextStrike::GrTextStrike(GrFontCache* cache, const GrKey* key,
22698539c607b05f7e25406ae873bf1b24154a36a6freed@google.com                           GrMaskFormat format,
2277d330eb19cd3c9278abce68ca0e3efabf2ec8f87commit-bot@chromium.org                           GrAtlasMgr* atlasMgr) : fPool(64), fAtlas(atlasMgr) {
228ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    fFontScalerKey = key;
229ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    fFontScalerKey->ref();
230ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
231ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    fFontCache = cache;     // no need to ref, it won't go away before we do
232ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    fAtlasMgr = atlasMgr;   // no need to ref, it won't go away before we do
233ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
23498539c607b05f7e25406ae873bf1b24154a36a6freed@google.com    fMaskFormat = format;
23598539c607b05f7e25406ae873bf1b24154a36a6freed@google.com
236515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG
2373ef80cf14c3222f705c291123106991e52061678reed@google.com//    GrPrintf(" GrTextStrike %p %d\n", this, gCounter);
238ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    gCounter += 1;
239ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif
240ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
241ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
24267ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org// these signatures are needed because they're used with
24367ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org// SkTDArray::visitAll() (see destructor & removeUnusedAtlases())
24467ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.orgstatic void free_glyph(GrGlyph*& glyph) { glyph->free(); }
24567ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org
24667ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.orgstatic void invalidate_glyph(GrGlyph*& glyph) {
2477d330eb19cd3c9278abce68ca0e3efabf2ec8f87commit-bot@chromium.org    if (glyph->fPlot && glyph->fPlot->drawToken().isIssued()) {
2487d330eb19cd3c9278abce68ca0e3efabf2ec8f87commit-bot@chromium.org        glyph->fPlot = NULL;
24967ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org    }
25067ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org}
251ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
252ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrTextStrike::~GrTextStrike() {
253ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    fFontScalerKey->unref();
25467ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org    fCache.getArray().visitAll(free_glyph);
255ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
256515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG
257ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    gCounter -= 1;
2583ef80cf14c3222f705c291123106991e52061678reed@google.com//    GrPrintf("~GrTextStrike %p %d\n", this, gCounter);
259ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif
260ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
261ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
262ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrGlyph* GrTextStrike::generateGlyph(GrGlyph::PackedID packed,
263ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com                                     GrFontScaler* scaler) {
264fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org    SkIRect bounds;
265ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    if (!scaler->getPackedGlyphBounds(packed, &bounds)) {
266ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        return NULL;
267ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
268ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
269ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    GrGlyph* glyph = fPool.alloc();
270d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#if SK_DISTANCEFIELD_FONTS
271d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com    // expand bounds to hold full distance field data
272d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com    if (fUseDistanceField) {
273d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        bounds.fLeft   -= DISTANCE_FIELD_PAD;
274d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        bounds.fRight  += DISTANCE_FIELD_PAD;
275d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        bounds.fTop    -= DISTANCE_FIELD_PAD;
276d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        bounds.fBottom += DISTANCE_FIELD_PAD;
277d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com    }
278d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#endif
279ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    glyph->init(packed, bounds);
280ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    fCache.insert(packed, glyph);
281ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    return glyph;
282ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
283ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
2847d330eb19cd3c9278abce68ca0e3efabf2ec8f87commit-bot@chromium.orgbool GrTextStrike::removeUnusedPlots() {
28567ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org    fCache.getArray().visitAll(invalidate_glyph);
2867d330eb19cd3c9278abce68ca0e3efabf2ec8f87commit-bot@chromium.org    return fAtlasMgr->removeUnusedPlots(&fAtlas);
28767ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org}
28867ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org
289d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
29049e80830e9c633dcb8e7596bda17ea004ae48bd4commit-bot@chromium.orgbool GrTextStrike::getGlyphAtlas(GrGlyph* glyph, GrFontScaler* scaler) {
2910ebe81a2b7a2dfd3b978520c2594e448bdbadca0reed@google.com#if 0   // testing hack to force us to flush our cache often
2920ebe81a2b7a2dfd3b978520c2594e448bdbadca0reed@google.com    static int gCounter;
2930ebe81a2b7a2dfd3b978520c2594e448bdbadca0reed@google.com    if ((++gCounter % 10) == 0) return false;
2940ebe81a2b7a2dfd3b978520c2594e448bdbadca0reed@google.com#endif
2950ebe81a2b7a2dfd3b978520c2594e448bdbadca0reed@google.com
296f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org    SkASSERT(glyph);
297f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org    SkASSERT(scaler);
298f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org    SkASSERT(fCache.contains(glyph));
29949e80830e9c633dcb8e7596bda17ea004ae48bd4commit-bot@chromium.org    SkASSERT(NULL == glyph->fPlot);
300ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
301a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.org    SkAutoRef ar(scaler);
30298539c607b05f7e25406ae873bf1b24154a36a6freed@google.com
30398539c607b05f7e25406ae873bf1b24154a36a6freed@google.com    int bytesPerPixel = GrMaskFormatBytesPerPixel(fMaskFormat);
304d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
305d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com    GrPlot* plot;
306d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#if SK_DISTANCEFIELD_FONTS
307d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com    if (fUseDistanceField) {
308d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        SkASSERT(1 == bytesPerPixel);
309d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
310d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        // we've already expanded the glyph dimensions to match the final size
311d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        // but must shrink back down to get the packed glyph data
312d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        int dfWidth = glyph->width();
313d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        int dfHeight = glyph->height();
314d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        int width = dfWidth - 2*DISTANCE_FIELD_PAD;
315d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        int height = dfHeight - 2*DISTANCE_FIELD_PAD;
316d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        size_t stride = width*bytesPerPixel;
317d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
318d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        size_t size = width * height * bytesPerPixel;
319d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        SkAutoSMalloc<1024> storage(size);
320d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        if (!scaler->getPackedGlyphImage(glyph->fPackedID, width, height, stride, storage.get())) {
321d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            return false;
322d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        }
323d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
324d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        // alloc storage for distance field glyph
325d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        size_t dfSize = dfWidth * dfHeight * bytesPerPixel;
326d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        SkAutoSMalloc<1024> dfStorage(dfSize);
327d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
328d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        // copy glyph into distance field storage
329d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        sk_bzero(dfStorage.get(), dfSize);
330d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
331d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        unsigned char* ptr = (unsigned char*) storage.get();
332d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        unsigned char* dfPtr = (unsigned char*) dfStorage.get();
333d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        size_t dfStride = dfWidth*bytesPerPixel;
334d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        dfPtr += DISTANCE_FIELD_PAD*dfStride;
335d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        dfPtr += DISTANCE_FIELD_PAD*bytesPerPixel;
336d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
337d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        for (int i = 0; i < height; ++i) {
338d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            memcpy(dfPtr, ptr, stride);
339d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
340d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            dfPtr += dfStride;
341d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            ptr += stride;
342d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        }
343d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
344d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        // generate distance field data
345d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        SkAutoSMalloc<1024> distXStorage(dfWidth*dfHeight*sizeof(short));
346d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        SkAutoSMalloc<1024> distYStorage(dfWidth*dfHeight*sizeof(short));
347d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        SkAutoSMalloc<1024> outerDistStorage(dfWidth*dfHeight*sizeof(double));
348d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        SkAutoSMalloc<1024> innerDistStorage(dfWidth*dfHeight*sizeof(double));
349d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        SkAutoSMalloc<1024> gxStorage(dfWidth*dfHeight*sizeof(double));
350d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        SkAutoSMalloc<1024> gyStorage(dfWidth*dfHeight*sizeof(double));
351d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
352d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        short* distX = (short*) distXStorage.get();
353d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        short* distY = (short*) distYStorage.get();
354d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        double* outerDist = (double*) outerDistStorage.get();
355d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        double* innerDist = (double*) innerDistStorage.get();
356d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        double* gx = (double*) gxStorage.get();
357d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        double* gy = (double*) gyStorage.get();
358d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
359d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        dfPtr = (unsigned char*) dfStorage.get();
360d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        EDTAA::computegradient(dfPtr, dfWidth, dfHeight, gx, gy);
361d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        EDTAA::edtaa3(dfPtr, gx, gy, dfWidth, dfHeight, distX, distY, outerDist);
362d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
363d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        for (int i = 0; i < dfWidth*dfHeight; ++i) {
364d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            *dfPtr = 255 - *dfPtr;
365d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            dfPtr++;
366d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        }
367d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        dfPtr = (unsigned char*) dfStorage.get();
368d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        sk_bzero(gx, sizeof(double)*dfWidth*dfHeight);
369d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        sk_bzero(gy, sizeof(double)*dfWidth*dfHeight);
370d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        EDTAA::computegradient(dfPtr, dfWidth, dfHeight, gx, gy);
371d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        EDTAA::edtaa3(dfPtr, gx, gy, dfWidth, dfHeight, distX, distY, innerDist);
372d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
373d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        for (int i = 0; i < dfWidth*dfHeight; ++i) {
374d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            unsigned char val;
375d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            double outerval = outerDist[i];
37611a253b686d2f6e9def2de8a4507591fcadfe987skia.committer@gmail.com            if (outerval < 0.0) {
37711a253b686d2f6e9def2de8a4507591fcadfe987skia.committer@gmail.com                outerval = 0.0;
378d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            }
379d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            double innerval = innerDist[i];
38011a253b686d2f6e9def2de8a4507591fcadfe987skia.committer@gmail.com            if (innerval < 0.0) {
38111a253b686d2f6e9def2de8a4507591fcadfe987skia.committer@gmail.com                innerval = 0.0;
382d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            }
383d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            double dist = outerval - innerval;
384d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            if (dist <= -DISTANCE_FIELD_RANGE) {
385d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com                val = 255;
386d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            } else if (dist > DISTANCE_FIELD_RANGE) {
387d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com                val = 0;
388d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            } else {
389d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com                val = (unsigned char)((DISTANCE_FIELD_RANGE-dist)*128.0/DISTANCE_FIELD_RANGE);
390d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            }
391d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            *dfPtr++ = val;
392d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        }
39311a253b686d2f6e9def2de8a4507591fcadfe987skia.committer@gmail.com
394d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        // copy to atlas
39511a253b686d2f6e9def2de8a4507591fcadfe987skia.committer@gmail.com        plot = fAtlasMgr->addToAtlas(&fAtlas, dfWidth, dfHeight, dfStorage.get(),
396d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com                                     &glyph->fAtlasLocation);
397d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
398d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com    } else {
399d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#endif
400d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        size_t size = glyph->fBounds.area() * bytesPerPixel;
401d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        SkAutoSMalloc<1024> storage(size);
402d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        if (!scaler->getPackedGlyphImage(glyph->fPackedID, glyph->width(),
403d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com                                         glyph->height(),
404d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com                                         glyph->width() * bytesPerPixel,
405d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com                                         storage.get())) {
406d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com            return false;
407d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com        }
408d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com
40911a253b686d2f6e9def2de8a4507591fcadfe987skia.committer@gmail.com        plot = fAtlasMgr->addToAtlas(&fAtlas, glyph->width(),
41011a253b686d2f6e9def2de8a4507591fcadfe987skia.committer@gmail.com                                     glyph->height(), storage.get(),
411d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com                                     &glyph->fAtlasLocation);
412d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#if SK_DISTANCEFIELD_FONTS
413ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
414d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com#endif
415ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
4167d330eb19cd3c9278abce68ca0e3efabf2ec8f87commit-bot@chromium.org    if (NULL == plot) {
417ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com        return false;
418ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    }
419ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com
4207d330eb19cd3c9278abce68ca0e3efabf2ec8f87commit-bot@chromium.org    glyph->fPlot = plot;
421ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com    return true;
422ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com}
423