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#pragma once
18af102bee518191f1e6ad843f06dcd7a64611462dsergeyv#include "../utils/RingBuffer.h"
19af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
20af102bee518191f1e6ad843f06dcd7a64611462dsergeyv#include <utils/String8.h>
21af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
22af102bee518191f1e6ad843f06dcd7a64611462dsergeyvnamespace android {
23af102bee518191f1e6ad843f06dcd7a64611462dsergeyvnamespace uirenderer {
24af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
25af102bee518191f1e6ad843f06dcd7a64611462dsergeyvclass CacheTexture;
26af102bee518191f1e6ad843f06dcd7a64611462dsergeyvstruct CachedGlyphInfo;
27af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
28af102bee518191f1e6ad843f06dcd7a64611462dsergeyv// Tracks glyph uploads and recent rendered/skipped glyphs, so it can give an idea
29af102bee518191f1e6ad843f06dcd7a64611462dsergeyv// what a missing character is: skipped glyph, wrong coordinates in cache texture etc.
30af102bee518191f1e6ad843f06dcd7a64611462dsergeyvclass FontCacheHistoryTracker {
31af102bee518191f1e6ad843f06dcd7a64611462dsergeyvpublic:
32af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    void glyphRendered(CachedGlyphInfo*, int penX, int penY);
33af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    void glyphUploaded(CacheTexture*, uint32_t x, uint32_t y, uint16_t glyphW, uint16_t glyphH);
34af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    void glyphsCleared(CacheTexture*);
35af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    void frameCompleted();
36af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
37af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    void dump(String8& log) const;
38af102bee518191f1e6ad843f06dcd7a64611462dsergeyvprivate:
39af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    struct CachedGlyph {
40af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        void* texture;
41af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        uint16_t generation;
42af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        uint16_t startX;
43af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        uint16_t startY;
44af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        uint16_t bitmapW;
45af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        uint16_t bitmapH;
46af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    };
47af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
48af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    struct RenderEntry {
49af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        CachedGlyph glyph;
50af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        int penX;
51af102bee518191f1e6ad843f06dcd7a64611462dsergeyv        int penY;
52af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    };
53af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
54af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    static void dumpCachedGlyph(String8& log, const CachedGlyph& glyph);
55af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    static void dumpRenderEntry(String8& log, const RenderEntry& entry);
56af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    static void dumpUploadEntry(String8& log, const CachedGlyph& glyph);
57af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
58af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    RingBuffer<RenderEntry, 300> mRenderHistory;
59af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    RingBuffer<CachedGlyph, 120> mUploadHistory;
60af102bee518191f1e6ad843f06dcd7a64611462dsergeyv    uint16_t generation = 0;
61af102bee518191f1e6ad843f06dcd7a64611462dsergeyv};
62af102bee518191f1e6ad843f06dcd7a64611462dsergeyv
63af102bee518191f1e6ad843f06dcd7a64611462dsergeyv}; // namespace uirenderer
64af102bee518191f1e6ad843f06dcd7a64611462dsergeyv}; // namespace android