1af102bee518191f1e6ad843f06dcd7a64611462dsergeyv/*
2af102bee518191f1e6ad843f06dcd7a64611462dsergeyv * Copyright (C) 2016 The Android Open Source Project
3af102bee518191f1e6ad843f06dcd7a64611462dsergeyv *
4af102bee518191f1e6ad843f06dcd7a64611462dsergeyv * Licensed under the Apache License, Version 2.0 (the "License");
5af102bee518191f1e6ad843f06dcd7a64611462dsergeyv * you may not use this file except in compliance with the License.
6af102bee518191f1e6ad843f06dcd7a64611462dsergeyv * You may obtain a copy of the License at
7af102bee518191f1e6ad843f06dcd7a64611462dsergeyv *
8af102bee518191f1e6ad843f06dcd7a64611462dsergeyv *      http://www.apache.org/licenses/LICENSE-2.0
9af102bee518191f1e6ad843f06dcd7a64611462dsergeyv *
10af102bee518191f1e6ad843f06dcd7a64611462dsergeyv * Unless required by applicable law or agreed to in writing, software
11af102bee518191f1e6ad843f06dcd7a64611462dsergeyv * distributed under the License is distributed on an "AS IS" BASIS,
12af102bee518191f1e6ad843f06dcd7a64611462dsergeyv * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13af102bee518191f1e6ad843f06dcd7a64611462dsergeyv * See the License for the specific language governing permissions and
14af102bee518191f1e6ad843f06dcd7a64611462dsergeyv * limitations under the License.
15af102bee518191f1e6ad843f06dcd7a64611462dsergeyv */
16af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
17af102bee518191f1e6ad843f06dcd7a64611462dsergeyv#include "FontCacheHistoryTracker.h"
18af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
19af102bee518191f1e6ad843f06dcd7a64611462dsergeyv#include "CachedGlyphInfo.h"
20af102bee518191f1e6ad843f06dcd7a64611462dsergeyv#include "CacheTexture.h"
21af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
22af102bee518191f1e6ad843f06dcd7a64611462dsergeyvnamespace android {
23af102bee518191f1e6ad843f06dcd7a64611462dsergeyvnamespace uirenderer {
24af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
25af102bee518191f1e6ad843f06dcd7a64611462dsergeyvvoid FontCacheHistoryTracker::dumpCachedGlyph(String8& log, const CachedGlyph& glyph) {
26af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    log.appendFormat("glyph (texture %p, position: (%d, %d), size: %dx%d, gen: %d)", glyph.texture,
27af102bee518191f1e6ad843f06dcd7a64611462dsergeyv            glyph.startX, glyph.startY, glyph.bitmapW, glyph.bitmapH, glyph.generation);
28af102bee518191f1e6ad843f06dcd7a64611462dsergeyv}
29af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
30af102bee518191f1e6ad843f06dcd7a64611462dsergeyvvoid FontCacheHistoryTracker::dumpRenderEntry(String8& log, const RenderEntry& entry) {
31af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    if (entry.penX == -1 && entry.penY == -1) {
32af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        log.appendFormat("      glyph skipped in gen: %d\n", entry.glyph.generation);
33af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    } else {
34af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        log.appendFormat("      rendered ");
35af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        dumpCachedGlyph(log, entry.glyph);
36af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        log.appendFormat(" at (%d, %d)\n", entry.penX, entry.penY);
37af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    }
38af102bee518191f1e6ad843f06dcd7a64611462dsergeyv}
39af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
40af102bee518191f1e6ad843f06dcd7a64611462dsergeyvvoid FontCacheHistoryTracker::dumpUploadEntry(String8& log, const CachedGlyph& glyph) {
41af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    if (glyph.bitmapW == 0 && glyph.bitmapH == 0) {
42af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        log.appendFormat("      cleared cachetexture %p in gen %d\n", glyph.texture,
43af102bee518191f1e6ad843f06dcd7a64611462dsergeyv                glyph.generation);
44af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    } else {
45af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        log.appendFormat("      uploaded ");
46af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        dumpCachedGlyph(log, glyph);
47af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        log.appendFormat("\n");
48af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    }
49af102bee518191f1e6ad843f06dcd7a64611462dsergeyv}
50af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
51af102bee518191f1e6ad843f06dcd7a64611462dsergeyvvoid FontCacheHistoryTracker::dump(String8& log) const {
52af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    log.appendFormat("FontCacheHistory: \n");
53af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    log.appendFormat("  Upload history: \n");
54af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    for (size_t i = 0; i < mUploadHistory.size(); i++) {
55af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        dumpUploadEntry(log, mUploadHistory[i]);
56af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    }
57af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    log.appendFormat("  Render history: \n");
58af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    for (size_t i = 0; i < mRenderHistory.size(); i++) {
59af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        dumpRenderEntry(log, mRenderHistory[i]);
60af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    }
61af102bee518191f1e6ad843f06dcd7a64611462dsergeyv}
62af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
63af102bee518191f1e6ad843f06dcd7a64611462dsergeyvvoid FontCacheHistoryTracker::glyphRendered(CachedGlyphInfo* glyphInfo, int penX, int penY) {
64af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    RenderEntry& entry = mRenderHistory.next();
65af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    entry.glyph.generation = generation;
66af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    entry.glyph.texture = glyphInfo->mCacheTexture;
67af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    entry.glyph.startX = glyphInfo->mStartX;
68af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    entry.glyph.startY = glyphInfo->mStartY;
69af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    entry.glyph.bitmapW = glyphInfo->mBitmapWidth;
70af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    entry.glyph.bitmapH = glyphInfo->mBitmapHeight;
71af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    entry.penX = penX;
72af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    entry.penY = penY;
73af102bee518191f1e6ad843f06dcd7a64611462dsergeyv}
74af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
75af102bee518191f1e6ad843f06dcd7a64611462dsergeyvvoid FontCacheHistoryTracker::glyphUploaded(CacheTexture* texture, uint32_t x, uint32_t y,
76af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        uint16_t glyphW, uint16_t glyphH) {
77af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    CachedGlyph& glyph = mUploadHistory.next();
78af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    glyph.generation = generation;
79af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    glyph.texture = texture;
80af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    glyph.startX = x;
81af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    glyph.startY = y;
82af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    glyph.bitmapW = glyphW;
83af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    glyph.bitmapH = glyphH;
84af102bee518191f1e6ad843f06dcd7a64611462dsergeyv}
85af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
86af102bee518191f1e6ad843f06dcd7a64611462dsergeyvvoid FontCacheHistoryTracker::glyphsCleared(CacheTexture* texture) {
87af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    CachedGlyph& glyph = mUploadHistory.next();
88af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    glyph.generation = generation;
89af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    glyph.texture = texture;
90af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    glyph.startX = 0;
91af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    glyph.startY = 0;
92af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    glyph.bitmapW = 0;
93af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    glyph.bitmapH = 0;
94af102bee518191f1e6ad843f06dcd7a64611462dsergeyv}
95af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
96af102bee518191f1e6ad843f06dcd7a64611462dsergeyvvoid FontCacheHistoryTracker::frameCompleted() {
97af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    generation++;
98af102bee518191f1e6ad843f06dcd7a64611462dsergeyv}
99af102bee518191f1e6ad843f06dcd7a64611462dsergeyv}; // namespace uirenderer
100af102bee518191f1e6ad843f06dcd7a64611462dsergeyv}; // namespace android
101