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