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