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