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