180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkGraphics_DEFINED 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkGraphics_DEFINED 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTypes.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SK_API SkGraphics { 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Call this at process initialization time if your environment does not 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * permit static global initializers that execute code. Note that 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Init() is not thread-safe. 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static void Init(); 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Call this to release any memory held privately, such as the font cache. 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static void Term(); 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Return the version numbers for the library. If the parameter is not 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * null, it is set to the version number. 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static void GetVersion(int32_t* major, int32_t* minor, int32_t* patch); 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Return the max number of bytes that should be used by the font cache. 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * If the cache needs to allocate more, it will purge previous entries. 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * This max can be changed by calling SetFontCacheLimit(). 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static size_t GetFontCacheLimit(); 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Specify the max number of bytes that should be used by the font cache. 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * If the cache needs to allocate more, it will purge previous entries. 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * This function returns the previous setting, as if GetFontCacheLimit() 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * had be called before the new limit was set. 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static size_t SetFontCacheLimit(size_t bytes); 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Return the number of bytes currently used by the font cache. 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static size_t GetFontCacheUsed(); 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 570a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * Return the number of entries in the font cache. 580a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * A cache "entry" is associated with each typeface + pointSize + matrix. 590a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger */ 600a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger static int GetFontCacheCountUsed(); 610a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 620a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger /** 630a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * Return the current limit to the number of entries in the font cache. 640a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * A cache "entry" is associated with each typeface + pointSize + matrix. 650a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger */ 660a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger static int GetFontCacheCountLimit(); 670a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 680a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger /** 690a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * Set the limit to the number of entries in the font cache, and return 700a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * the previous value. If this new value is lower than the previous, 710a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger * it will automatically try to purge entries to meet the new limit. 720a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger */ 730a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger static int SetFontCacheCountLimit(int count); 740a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 750a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger /** 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * For debugging purposes, this will attempt to purge the font cache. It 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * does not change the limit, but will cause subsequent font measures and 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * draws to be recreated, since they will no longer be in the cache. 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static void PurgeFontCache(); 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 824e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger /** 834e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * Scaling bitmaps with the SkPaint::kHigh_FilterLevel setting is 844e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * expensive, so the result is saved in the global Scaled Image 854e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * Cache. 864e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * 874e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * This function returns the memory usage of the Scaled Image Cache. 884e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger */ 894e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger static size_t GetImageCacheTotalBytesUsed(); 904e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger /** 914e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * These functions get/set the memory usage limit for the Scaled 924e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * Image Cache. Bitmaps are purged from the cache when the 934e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * memory useage exceeds this limit. 944e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger */ 954e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger static size_t GetImageCacheTotalByteLimit(); 964e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger static size_t SetImageCacheTotalByteLimit(size_t newLimit); 974e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger 984e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger // DEPRECATED 994e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger static size_t GetImageCacheBytesUsed() { 1004e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger return GetImageCacheTotalBytesUsed(); 1014e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger } 1024e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger // DEPRECATED 1034e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger static size_t GetImageCacheByteLimit() { 1044e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger return GetImageCacheTotalByteLimit(); 1054e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger } 1064e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger // DEPRECATED 1074e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger static size_t SetImageCacheByteLimit(size_t newLimit) { 1084e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger return SetImageCacheTotalByteLimit(newLimit); 1094e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger } 1104e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger 1114e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger /** 1124e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * Scaling bitmaps with the SkPaint::kHigh_FilterLevel setting is 1134e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * expensive, so the result is saved in the global Scaled Image 1144e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * Cache. When the resulting bitmap is too large, this can 1154e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * overload the cache. If the ImageCacheSingleAllocationByteLimit 1164e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * is set to a non-zero number, and the resulting bitmap would be 1174e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * larger than that value, the bitmap scaling algorithm falls 1184e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * back onto a cheaper algorithm and does not cache the result. 1194e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger * Zero is the default value. 1204e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger */ 1214e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger static size_t GetImageCacheSingleAllocationByteLimit(); 1224e4a89dab47d74874d6a79c4b34d89ffbfb386afDerek Sollenberger static size_t SetImageCacheSingleAllocationByteLimit(size_t newLimit); 12358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Applications with command line options may pass optional state, such 12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * as cache sizes, here, for instance: 12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * font-cache-limit=12345678 12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * The flags format is name=value[;name=value...] with no spaces. 13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * This format is subject to change. 13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static void SetFlags(const char* flags); 13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Return the max number of bytes that should be used by the thread-local 13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * font cache. 13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * If the cache needs to allocate more, it will purge previous entries. 13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * This max can be changed by calling SetFontCacheLimit(). 13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * If this thread has never called SetTLSFontCacheLimit, or has called it 14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * with 0, then this thread is using the shared font cache. In that case, 14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * this function will always return 0, and the caller may want to call 14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * GetFontCacheLimit. 14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static size_t GetTLSFontCacheLimit(); 14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** 14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Specify the max number of bytes that should be used by the thread-local 14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * font cache. If this value is 0, then this thread will use the shared 15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * global font cache. 15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static void SetTLSFontCacheLimit(size_t bytes); 15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** This is automatically called by SkGraphics::Init(), and must be 15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru implemented by the host OS. This allows the host OS to register a callback 15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru with the C++ runtime to call SkGraphics::FreeCaches() 15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static void InstallNewHandler(); 16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkAutoGraphics { 16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAutoGraphics() { 16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkGraphics::Init(); 16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ~SkAutoGraphics() { 16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkGraphics::Term(); 16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 173