{"version":3,"file":"cache.min.mjs","sources":["../../src/cache.ts"],"sourcesContent":["import { config } from './config';\nimport type { TRectBounds } from './typedefs';\n\ntype TextCouplesCache = Map</** char */ string, /** width */ number>;\n\ntype FamilyCache = Map</** fontStyleCacheKey */ string, TextCouplesCache>;\n\nexport class Cache {\n  /**\n   * Cache of widths of chars in text rendering.\n   */\n  declare charWidthsCache: Map</** fontFamily */ string, FamilyCache>;\n\n  constructor() {\n    this.charWidthsCache = new Map();\n  }\n\n  /**\n   * @return {Object} reference to cache\n   */\n  getFontCache({\n    fontFamily,\n    fontStyle,\n    fontWeight,\n  }: {\n    fontFamily: string;\n    fontStyle: string;\n    fontWeight: string | number;\n  }): TextCouplesCache {\n    fontFamily = fontFamily.toLowerCase();\n    const cache = this.charWidthsCache;\n    if (!cache.has(fontFamily)) {\n      cache.set(fontFamily, new Map<string, TextCouplesCache>());\n    }\n    const fontCache = cache.get(fontFamily)!;\n    const cacheKey = `${fontStyle.toLowerCase()}_${(\n      fontWeight + ''\n    ).toLowerCase()}`;\n    if (!fontCache.has(cacheKey)) {\n      fontCache.set(cacheKey, new Map<string, number>());\n    }\n    return fontCache.get(cacheKey)!;\n  }\n\n  /**\n   * Clear char widths cache for the given font family or all the cache if no\n   * fontFamily is specified.\n   * Use it if you know you are loading fonts in a lazy way and you are not waiting\n   * for custom fonts to load properly when adding text objects to the canvas.\n   * If a text object is added when its own font is not loaded yet, you will get wrong\n   * measurement and so wrong bounding boxes.\n   * After the font cache is cleared, either change the textObject text content or call\n   * initDimensions() to trigger a recalculation\n   * @param {String} [fontFamily] font family to clear\n   */\n  clearFontCache(fontFamily?: string) {\n    if (!fontFamily) {\n      this.charWidthsCache = new Map();\n    } else {\n      this.charWidthsCache.delete((fontFamily || '').toLowerCase());\n    }\n  }\n\n  /**\n   * Given current aspect ratio, determines the max width and height that can\n   * respect the total allowed area for the cache.\n   * @param {number} ar aspect ratio\n   * @return {number[]} Limited dimensions X and Y\n   */\n  limitDimsByArea(ar: number) {\n    const { perfLimitSizeTotal } = config;\n    const roughWidth = Math.sqrt(perfLimitSizeTotal * ar);\n    // we are not returning a point on purpose, to avoid circular dependencies\n    // this is an internal utility\n    return [\n      Math.floor(roughWidth),\n      Math.floor(perfLimitSizeTotal / roughWidth),\n    ];\n  }\n\n  /**\n   * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n   * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n   * you do not get any speed benefit and you get a big object in memory.\n   * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n   * can eventually clear it.\n   * It was an internal variable, is accessible since version 2.3.4\n   */\n  boundsOfCurveCache: Record<string, TRectBounds> = {};\n}\n\nexport const cache = new Cache();\n"],"names":["Cache","constructor","_defineProperty","this","charWidthsCache","Map","getFontCache","_ref","fontFamily","fontStyle","fontWeight","toLowerCase","cache","has","set","fontCache","get","cacheKey","clearFontCache","delete","limitDimsByArea","ar","perfLimitSizeTotal","config","roughWidth","Math","sqrt","floor"],"mappings":"yHAOO,MAAMA,EAMXC,WAAAA,GAmEAC,EAAAC,KAAA,qBAQkD,IA1EhDA,KAAKC,gBAAkB,IAAIC,GAC7B,CAKAC,YAAAA,CAAYC,GAQS,IARRC,WACXA,EAAUC,UACVA,EAASC,WACTA,GAKDH,EACCC,EAAaA,EAAWG,cACxB,MAAMC,EAAQT,KAAKC,gBACdQ,EAAMC,IAAIL,IACbI,EAAME,IAAIN,EAAY,IAAIH,KAE5B,MAAMU,EAAYH,EAAMI,IAAIR,GACtBS,EAAW,GAAGR,EAAUE,kBAC5BD,EAAa,IACbC,gBAIF,OAHKI,EAAUF,IAAII,IACjBF,EAAUD,IAAIG,EAAU,IAAIZ,KAEvBU,EAAUC,IAAIC,EACvB,CAaAC,cAAAA,CAAeV,GACRA,EAGHL,KAAKC,gBAAgBe,QAAQX,GAAc,IAAIG,eAF/CR,KAAKC,gBAAkB,IAAIC,GAI/B,CAQAe,eAAAA,CAAgBC,GACd,MAAMC,mBAAEA,GAAuBC,EACzBC,EAAaC,KAAKC,KAAKJ,EAAqBD,GAGlD,MAAO,CACLI,KAAKE,MAAMH,GACXC,KAAKE,MAAML,EAAqBE,GAEpC,QAaWZ,EAAQ,IAAIZ"}