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 "GrGpu.h" 9ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrRectanizer.h" 10ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrTextStrike.h" 11ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#include "GrTextStrike_impl.h" 1203e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org#include "SkString.h" 13ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 148065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org#include "SkDistanceFieldGen.h" 15d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com 16fa35e3ddcc9d130ce87c927218bdf27879c38711reed@google.com/////////////////////////////////////////////////////////////////////////////// 17fa35e3ddcc9d130ce87c927218bdf27879c38711reed@google.com 1853e1e4d88a06db62898a3bf75751c042729d7160commit-bot@chromium.org#define GR_ATLAS_TEXTURE_WIDTH 1024 1953e1e4d88a06db62898a3bf75751c042729d7160commit-bot@chromium.org#define GR_ATLAS_TEXTURE_HEIGHT 2048 2053e1e4d88a06db62898a3bf75751c042729d7160commit-bot@chromium.org 2153e1e4d88a06db62898a3bf75751c042729d7160commit-bot@chromium.org#define GR_PLOT_WIDTH 256 2253e1e4d88a06db62898a3bf75751c042729d7160commit-bot@chromium.org#define GR_PLOT_HEIGHT 256 2353e1e4d88a06db62898a3bf75751c042729d7160commit-bot@chromium.org 2453e1e4d88a06db62898a3bf75751c042729d7160commit-bot@chromium.org#define GR_NUM_PLOTS_X (GR_ATLAS_TEXTURE_WIDTH / GR_PLOT_WIDTH) 2553e1e4d88a06db62898a3bf75751c042729d7160commit-bot@chromium.org#define GR_NUM_PLOTS_Y (GR_ATLAS_TEXTURE_HEIGHT / GR_PLOT_HEIGHT) 2653e1e4d88a06db62898a3bf75751c042729d7160commit-bot@chromium.org 2767ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org#define FONT_CACHE_STATS 0 2867ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org#if FONT_CACHE_STATS 2967ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.orgstatic int g_PurgeCount = 0; 3067ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org#endif 3167ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org 32ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrFontCache::GrFontCache(GrGpu* gpu) : fGpu(gpu) { 33ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com gpu->ref(); 34f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org for (int i = 0; i < kAtlasCount; ++i) { 353fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org fAtlasMgr[i] = NULL; 363fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org } 37ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 38ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fHead = fTail = NULL; 39ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 40ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 41ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrFontCache::~GrFontCache() { 42ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fCache.deleteAll(); 43f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org for (int i = 0; i < kAtlasCount; ++i) { 443fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org delete fAtlasMgr[i]; 453fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org } 46ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fGpu->unref(); 4767ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org#if FONT_CACHE_STATS 4867ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org GrPrintf("Num purges: %d\n", g_PurgeCount); 4967ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org#endif 50ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 51ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 52952944144758dd3f9a8a010ec1d99cb4bd035ae4commit-bot@chromium.orgstatic GrPixelConfig mask_format_to_pixel_config(GrMaskFormat format) { 536e515d67d2365ecd05fb80762eeb76c55e81368cskia.committer@gmail.com static const GrPixelConfig sPixelConfigs[] = { 546e515d67d2365ecd05fb80762eeb76c55e81368cskia.committer@gmail.com kAlpha_8_GrPixelConfig, 556e515d67d2365ecd05fb80762eeb76c55e81368cskia.committer@gmail.com kRGB_565_GrPixelConfig, 56f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org kSkia8888_GrPixelConfig, 57f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org kSkia8888_GrPixelConfig 58f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org }; 59f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org SK_COMPILE_ASSERT(SK_ARRAY_COUNT(sPixelConfigs) == kMaskFormatCount, array_size_mismatch); 60f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org 61f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org return sPixelConfigs[format]; 62f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org} 63f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org 64f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.orgstatic int mask_format_to_atlas_index(GrMaskFormat format) { 656e515d67d2365ecd05fb80762eeb76c55e81368cskia.committer@gmail.com static const int sAtlasIndices[] = { 666e515d67d2365ecd05fb80762eeb76c55e81368cskia.committer@gmail.com GrFontCache::kA8_AtlasType, 676e515d67d2365ecd05fb80762eeb76c55e81368cskia.committer@gmail.com GrFontCache::k565_AtlasType, 686e515d67d2365ecd05fb80762eeb76c55e81368cskia.committer@gmail.com GrFontCache::k8888_AtlasType, 696e515d67d2365ecd05fb80762eeb76c55e81368cskia.committer@gmail.com GrFontCache::k8888_AtlasType 70f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org }; 71f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org SK_COMPILE_ASSERT(SK_ARRAY_COUNT(sAtlasIndices) == kMaskFormatCount, array_size_mismatch); 72f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org 73f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org SkASSERT(sAtlasIndices[format] < GrFontCache::kAtlasCount); 74f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org return sAtlasIndices[format]; 75952944144758dd3f9a8a010ec1d99cb4bd035ae4commit-bot@chromium.org} 76952944144758dd3f9a8a010ec1d99cb4bd035ae4commit-bot@chromium.org 77ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrTextStrike* GrFontCache::generateStrike(GrFontScaler* scaler, 78ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com const Key& key) { 793fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org GrMaskFormat format = scaler->getMaskFormat(); 80952944144758dd3f9a8a010ec1d99cb4bd035ae4commit-bot@chromium.org GrPixelConfig config = mask_format_to_pixel_config(format); 81f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org int atlasIndex = mask_format_to_atlas_index(format); 82f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org if (NULL == fAtlasMgr[atlasIndex]) { 8353e1e4d88a06db62898a3bf75751c042729d7160commit-bot@chromium.org SkISize textureSize = SkISize::Make(GR_ATLAS_TEXTURE_WIDTH, 8453e1e4d88a06db62898a3bf75751c042729d7160commit-bot@chromium.org GR_ATLAS_TEXTURE_HEIGHT); 8553e1e4d88a06db62898a3bf75751c042729d7160commit-bot@chromium.org fAtlasMgr[atlasIndex] = SkNEW_ARGS(GrAtlasMgr, (fGpu, config, 8653e1e4d88a06db62898a3bf75751c042729d7160commit-bot@chromium.org textureSize, 8753e1e4d88a06db62898a3bf75751c042729d7160commit-bot@chromium.org GR_NUM_PLOTS_X, 887801faaab9bf7dd0ac67e859c4e284e74f7bd46fcommit-bot@chromium.org GR_NUM_PLOTS_Y, 897801faaab9bf7dd0ac67e859c4e284e74f7bd46fcommit-bot@chromium.org true)); 90ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 91c377baf406996aed18d82d328029c82dbc3b8ddatomhudson@google.com GrTextStrike* strike = SkNEW_ARGS(GrTextStrike, 92f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org (this, scaler->getKey(), format, fAtlasMgr[atlasIndex])); 93ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fCache.insert(key, strike); 94ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 95ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com if (fHead) { 96ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fHead->fPrev = strike; 97ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } else { 98f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(NULL == fTail); 99ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fTail = strike; 100ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 101ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com strike->fPrev = NULL; 102ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com strike->fNext = fHead; 103ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fHead = strike; 104ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 105ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return strike; 106ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 107ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 108ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comvoid GrFontCache::freeAll() { 109ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fCache.deleteAll(); 110f8cb184095946ebf8f183d253e27bd544a19f23ccommit-bot@chromium.org for (int i = 0; i < kAtlasCount; ++i) { 1113fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org delete fAtlasMgr[i]; 1123fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org fAtlasMgr[i] = NULL; 1133fddf0eed6dc2873bcc8e584f435c6cd34964518commit-bot@chromium.org } 1148fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com fHead = NULL; 1158fe72477f204b1a45393e6a64caa84fd287b805bbsalomon@google.com fTail = NULL; 116ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 117ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 118b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.orgvoid GrFontCache::purgeStrike(GrTextStrike* strike) { 119b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.org const GrFontCache::Key key(strike->fFontScalerKey); 120b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.org fCache.remove(key, strike); 121b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.org this->detachStrikeFromList(strike); 122b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.org delete strike; 123b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.org} 124b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.org 125c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.orgbool GrFontCache::freeUnusedPlot(GrTextStrike* preserveStrike) { 126bbe55fdf6608b8aec2e5d3945da6b1872b3a380fjvanverth@google.com SkASSERT(NULL != preserveStrike); 127c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org 128c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org GrAtlasMgr* atlasMgr = preserveStrike->fAtlasMgr; 129c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org GrPlot* plot = atlasMgr->getUnusedPlot(); 130c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org if (NULL == plot) { 131c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org return false; 132c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org } 133c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org plot->resetRects(); 134c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org 135c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org GrTextStrike* strike = fHead; 136bbe55fdf6608b8aec2e5d3945da6b1872b3a380fjvanverth@google.com GrMaskFormat maskFormat = preserveStrike->fMaskFormat; 13767ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org while (strike) { 138c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org if (maskFormat != strike->fMaskFormat) { 139c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org strike = strike->fNext; 14067ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org continue; 14167ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org } 142c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org 14367ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org GrTextStrike* strikeToPurge = strike; 144c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org strike = strikeToPurge->fNext; 145c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org strikeToPurge->removePlot(plot); 146c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org 147c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org // clear out any empty strikes (except this one) 148c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org if (strikeToPurge != preserveStrike && strikeToPurge->fAtlas.isEmpty()) { 149b2e9fa529862bd1f7b983a17b3c72acfb3d0367dcommit-bot@chromium.org this->purgeStrike(strikeToPurge); 15067ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org } 15167ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org } 152c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org 15367ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org#if FONT_CACHE_STATS 15467ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org ++g_PurgeCount; 15567ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org#endif 15667ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org 157c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org return true; 158ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 159ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 160515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 161ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comvoid GrFontCache::validate() const { 162ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com int count = fCache.count(); 163ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com if (0 == count) { 164f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(!fHead); 165f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(!fTail); 166ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } else if (1 == count) { 167f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fHead == fTail); 168ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } else { 169f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fHead != fTail); 170ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 171ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 172ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com int count2 = 0; 173ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com const GrTextStrike* strike = fHead; 174ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com while (strike) { 175ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com count2 += 1; 176ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com strike = strike->fNext; 177ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 178f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(count == count2); 179ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 180ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com count2 = 0; 181ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com strike = fTail; 182ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com while (strike) { 183ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com count2 += 1; 184ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com strike = strike->fPrev; 185ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 186f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(count == count2); 187ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 188ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif 189ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 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; 1974362a38563a958083aca2b456aaaa9f756f6f4e1commit-bot@chromium.org#ifdef SK_BUILD_FOR_ANDROID 1984362a38563a958083aca2b456aaaa9f756f6f4e1commit-bot@chromium.org filename.printf("/sdcard/fontcache_%d%d.png", gDumpCount, i); 1994362a38563a958083aca2b456aaaa9f756f6f4e1commit-bot@chromium.org#else 20003e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org filename.printf("fontcache_%d%d.png", gDumpCount, i); 2014362a38563a958083aca2b456aaaa9f756f6f4e1commit-bot@chromium.org#endif 20203e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org texture->savePixels(filename.c_str()); 20303e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org } 20403e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org } 20503e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org } 20603e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org ++gDumpCount; 20703e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org} 20803e3e89641c93df603dfb705d518848dfe81427ecommit-bot@chromium.org 209ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com/////////////////////////////////////////////////////////////////////////////// 210ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 211515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 212ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com static int gCounter; 213ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif 214ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 215ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com/* 216ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com The text strike is specific to a given font/style/matrix setup, which is 217ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com represented by the GrHostFontScaler object we are given in getGlyph(). 218ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 219ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com We map a 32bit glyphID to a GrGlyph record, which in turn points to a 220ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com atlas and a position within that texture. 221ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com */ 222ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 223ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrTextStrike::GrTextStrike(GrFontCache* cache, const GrKey* key, 22498539c607b05f7e25406ae873bf1b24154a36a6freed@google.com GrMaskFormat format, 225c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org GrAtlasMgr* atlasMgr) : fPool(64) { 226ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fFontScalerKey = key; 227ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fFontScalerKey->ref(); 228ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 229ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fFontCache = cache; // no need to ref, it won't go away before we do 230ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fAtlasMgr = atlasMgr; // no need to ref, it won't go away before we do 231ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 23298539c607b05f7e25406ae873bf1b24154a36a6freed@google.com fMaskFormat = format; 23398539c607b05f7e25406ae873bf1b24154a36a6freed@google.com 234515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 2353ef80cf14c3222f705c291123106991e52061678reed@google.com// GrPrintf(" GrTextStrike %p %d\n", this, gCounter); 236ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com gCounter += 1; 237ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif 238ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 239ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 240c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org// this signature is needed because it's used with 241c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org// SkTDArray::visitAll() (see destructor) 24267ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.orgstatic void free_glyph(GrGlyph*& glyph) { glyph->free(); } 24367ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org 244ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrTextStrike::~GrTextStrike() { 245ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fFontScalerKey->unref(); 24667ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org fCache.getArray().visitAll(free_glyph); 247ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 248515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 249ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com gCounter -= 1; 2503ef80cf14c3222f705c291123106991e52061678reed@google.com// GrPrintf("~GrTextStrike %p %d\n", this, gCounter); 251ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com#endif 252ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 253ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 254ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.comGrGlyph* GrTextStrike::generateGlyph(GrGlyph::PackedID packed, 255ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrFontScaler* scaler) { 256fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org SkIRect bounds; 257762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org if (fUseDistanceField) { 258762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org if (!scaler->getPackedGlyphDFBounds(packed, &bounds)) { 259762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org return NULL; 260762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org } 261762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org } else { 262762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org if (!scaler->getPackedGlyphBounds(packed, &bounds)) { 263762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org return NULL; 264762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org } 265ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 266ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 267ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com GrGlyph* glyph = fPool.alloc(); 268ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com glyph->init(packed, bounds); 269ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com fCache.insert(packed, glyph); 270ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return glyph; 271ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 272ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 273c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.orgvoid GrTextStrike::removePlot(const GrPlot* plot) { 274c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org SkTDArray<GrGlyph*>& glyphArray = fCache.getArray(); 275c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org for (int i = 0; i < glyphArray.count(); ++i) { 276c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org if (plot == glyphArray[i]->fPlot) { 277c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org glyphArray[i]->fPlot = NULL; 278c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org } 279c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org } 280c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org 281c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.org fAtlasMgr->removePlot(&fAtlas, plot); 28267ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org} 28367ed64e9aa70f5a95a2d309f9b73dc0009f3ed8ccommit-bot@chromium.org 284d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com 285c9b2c885be8d2bb39f1d75cc316278fa8d0fa9f0commit-bot@chromium.orgbool GrTextStrike::addGlyphToAtlas(GrGlyph* glyph, GrFontScaler* scaler) { 2860ebe81a2b7a2dfd3b978520c2594e448bdbadca0reed@google.com#if 0 // testing hack to force us to flush our cache often 2870ebe81a2b7a2dfd3b978520c2594e448bdbadca0reed@google.com static int gCounter; 2880ebe81a2b7a2dfd3b978520c2594e448bdbadca0reed@google.com if ((++gCounter % 10) == 0) return false; 2890ebe81a2b7a2dfd3b978520c2594e448bdbadca0reed@google.com#endif 2900ebe81a2b7a2dfd3b978520c2594e448bdbadca0reed@google.com 291f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(glyph); 292f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(scaler); 293f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org SkASSERT(fCache.contains(glyph)); 29449e80830e9c633dcb8e7596bda17ea004ae48bd4commit-bot@chromium.org SkASSERT(NULL == glyph->fPlot); 295ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 296a4de8c257ea0be8ff7081f645249b6afe5c48e7ecommit-bot@chromium.org SkAutoRef ar(scaler); 29798539c607b05f7e25406ae873bf1b24154a36a6freed@google.com 29898539c607b05f7e25406ae873bf1b24154a36a6freed@google.com int bytesPerPixel = GrMaskFormatBytesPerPixel(fMaskFormat); 299d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com 300762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org size_t size = glyph->fBounds.area() * bytesPerPixel; 301762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org SkAutoSMalloc<1024> storage(size); 302d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com if (fUseDistanceField) { 303762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org if (!scaler->getPackedGlyphDFImage(glyph->fPackedID, glyph->width(), 304762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org glyph->height(), 305762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org storage.get())) { 306d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com return false; 307d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com } 308d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com } else { 309d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com if (!scaler->getPackedGlyphImage(glyph->fPackedID, glyph->width(), 310d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com glyph->height(), 311d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com glyph->width() * bytesPerPixel, 312d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com storage.get())) { 313d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com return false; 314d830d13c27437b4677a4a1abfa866d98dc2d2ab9jvanverth@google.com } 315ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 316ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 317762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org GrPlot* plot = fAtlasMgr->addToAtlas(&fAtlas, glyph->width(), 318762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org glyph->height(), storage.get(), 319762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org &glyph->fAtlasLocation); 320762cd804375ff8478427dba4fe29379562b8fb60commit-bot@chromium.org 3217d330eb19cd3c9278abce68ca0e3efabf2ec8f87commit-bot@chromium.org if (NULL == plot) { 322ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return false; 323ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com } 324ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com 3257d330eb19cd3c9278abce68ca0e3efabf2ec8f87commit-bot@chromium.org glyph->fPlot = plot; 326ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com return true; 327ac10a2d039c5d52eed66e27cbbc503ab523c1cd5reed@google.com} 328