1cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp/* Copyright 2016 The TensorFlow Authors. All Rights Reserved.
2cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
3cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew HarpLicensed under the Apache License, Version 2.0 (the "License");
4cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harpyou may not use this file except in compliance with the License.
5cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew HarpYou may obtain a copy of the License at
6cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
7cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    http://www.apache.org/licenses/LICENSE-2.0
8cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
9cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew HarpUnless required by applicable law or agreed to in writing, software
10cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harpdistributed under the License is distributed on an "AS IS" BASIS,
11cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew HarpWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew HarpSee the License for the specific language governing permissions and
13cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harplimitations under the License.
14cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp==============================================================================*/
15cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
16cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harppackage org.tensorflow.demo.env;
17cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
18cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harpimport android.graphics.Canvas;
19cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harpimport android.graphics.Color;
20cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harpimport android.graphics.Paint;
21cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harpimport android.graphics.Paint.Align;
22cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harpimport android.graphics.Paint.Style;
23cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harpimport android.graphics.Rect;
24a1a3b0c6c3abe0df0c8e017d9f134db4731484b9Andrew Harpimport android.graphics.Typeface;
25a1a3b0c6c3abe0df0c8e017d9f134db4731484b9Andrew Harpimport java.util.Vector;
26cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
27cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp/**
28cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp * A class that encapsulates the tedious bits of rendering legible, bordered text onto a canvas.
29cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp */
30cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harppublic class BorderedText {
31cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  private final Paint interiorPaint;
32cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  private final Paint exteriorPaint;
33cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
34cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  private final float textSize;
35cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
36cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  /**
37cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp   * Creates a left-aligned bordered text object with a white interior, and a black exterior with
38cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp   * the specified text size.
39cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp   *
40cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp   * @param textSize text size in pixels
41cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp   */
42cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  public BorderedText(final float textSize) {
43cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    this(Color.WHITE, Color.BLACK, textSize);
44cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  }
45cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
46cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  /**
47cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp   * Create a bordered text object with the specified interior and exterior colors, text size and
48cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp   * alignment.
49cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp   *
50cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp   * @param interiorColor the interior text color
51cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp   * @param exteriorColor the exterior text color
52cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp   * @param textSize text size in pixels
53cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp   */
54cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  public BorderedText(final int interiorColor, final int exteriorColor, final float textSize) {
55cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    interiorPaint = new Paint();
56cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    interiorPaint.setTextSize(textSize);
57cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    interiorPaint.setColor(interiorColor);
58cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    interiorPaint.setStyle(Style.FILL);
59cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    interiorPaint.setAntiAlias(false);
60cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    interiorPaint.setAlpha(255);
61cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
62cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    exteriorPaint = new Paint();
63cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    exteriorPaint.setTextSize(textSize);
64cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    exteriorPaint.setColor(exteriorColor);
65cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    exteriorPaint.setStyle(Style.FILL_AND_STROKE);
66cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    exteriorPaint.setStrokeWidth(textSize / 8);
67cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    exteriorPaint.setAntiAlias(false);
68cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    exteriorPaint.setAlpha(255);
69cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
70cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    this.textSize = textSize;
71cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  }
72cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
73a1a3b0c6c3abe0df0c8e017d9f134db4731484b9Andrew Harp  public void setTypeface(Typeface typeface) {
74a1a3b0c6c3abe0df0c8e017d9f134db4731484b9Andrew Harp    interiorPaint.setTypeface(typeface);
75a1a3b0c6c3abe0df0c8e017d9f134db4731484b9Andrew Harp    exteriorPaint.setTypeface(typeface);
76a1a3b0c6c3abe0df0c8e017d9f134db4731484b9Andrew Harp  }
77cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
78a1a3b0c6c3abe0df0c8e017d9f134db4731484b9Andrew Harp  public void drawText(final Canvas canvas, final float posX, final float posY, final String text) {
79cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    canvas.drawText(text, posX, posY, exteriorPaint);
80cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    canvas.drawText(text, posX, posY, interiorPaint);
81cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  }
82cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
83a1a3b0c6c3abe0df0c8e017d9f134db4731484b9Andrew Harp  public void drawLines(Canvas canvas, final float posX, final float posY, Vector<String> lines) {
84a1a3b0c6c3abe0df0c8e017d9f134db4731484b9Andrew Harp    int lineNum = 0;
85a1a3b0c6c3abe0df0c8e017d9f134db4731484b9Andrew Harp    for (final String line : lines) {
86a1a3b0c6c3abe0df0c8e017d9f134db4731484b9Andrew Harp      drawText(canvas, posX, posY - getTextSize() * (lines.size() - lineNum - 1), line);
87a1a3b0c6c3abe0df0c8e017d9f134db4731484b9Andrew Harp      ++lineNum;
88a1a3b0c6c3abe0df0c8e017d9f134db4731484b9Andrew Harp    }
89a1a3b0c6c3abe0df0c8e017d9f134db4731484b9Andrew Harp  }
90a1a3b0c6c3abe0df0c8e017d9f134db4731484b9Andrew Harp
91cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  public void setInteriorColor(final int color) {
92cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    interiorPaint.setColor(color);
93cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  }
94cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
95cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  public void setExteriorColor(final int color) {
96cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    exteriorPaint.setColor(color);
97cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  }
98cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
99cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  public float getTextSize() {
100cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    return textSize;
101cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  }
102cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
103cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  public void setAlpha(final int alpha) {
104cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    interiorPaint.setAlpha(alpha);
105cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    exteriorPaint.setAlpha(alpha);
106cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  }
107cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
108cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  public void getTextBounds(
109cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp      final String line, final int index, final int count, final Rect lineBounds) {
110cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    interiorPaint.getTextBounds(line, index, count, lineBounds);
111cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  }
112cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp
113cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  public void setTextAlign(final Align align) {
114cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    interiorPaint.setTextAlign(align);
115cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp    exteriorPaint.setTextAlign(align);
116cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp  }
117cbc9e25583046e0eac12f12ec24f0312909a9b4dAndrew Harp}
118