/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.test.hwui;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.os.Bundle;
import android.view.View;

@SuppressWarnings({"UnusedDeclaration"})
public class TextOnPathActivity extends Activity {
    private Path mPath;
    private Path mStraightPath;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mPath = makePath();
        mStraightPath = makeStraightPath();

        final TextOnPathView view = new TextOnPathView(this);
        setContentView(view);
    }

    private static Path makePath() {
        Path path = new Path();
        buildPath(path);
        return path;
    }

    private static void buildPath(Path path) {
        path.moveTo(0.0f, 0.0f);
        path.cubicTo(0.0f, 0.0f, 100.0f, 150.0f, 100.0f, 200.0f);
        path.cubicTo(100.0f, 200.0f, 50.0f, 300.0f, -80.0f, 200.0f);
        path.cubicTo(-80.0f, 200.0f, 100.0f, 200.0f, 200.0f, 0.0f);
    }

    private static Path makeStraightPath() {
        Path path = new Path();
        buildStraightPath(path);
        return path;
    }

    private static void buildStraightPath(Path path) {
        path.moveTo(0.0f, 0.0f);
        path.lineTo(400.0f, 0.0f);
    }

    public class TextOnPathView extends View {
        private static final String TEST_STRING = "Hello OpenGL renderer, text on path! ";

        private final Paint mPaint;
        private final Paint mPathPaint;
        private final String mText;
        private final PathMeasure mMeasure;
        private final float mLength;
        private final float[] mLines;
        private final float[] mPos;
        private final float[] mTan;

        public TextOnPathView(Context c) {
            super(c);

            mPaint = new Paint();
            mPaint.setAntiAlias(true);
            mPaint.setColor(0xff000000);

            mPathPaint = new Paint();
            mPathPaint.setAntiAlias(true);
            mPathPaint.setStyle(Paint.Style.STROKE);
            mPathPaint.setColor(0xff000099);

            StringBuilder builder = new StringBuilder(TEST_STRING.length() * 2);
            for (int i = 0; i < 2; i++) {
                builder.append(TEST_STRING);
            }
            mText = builder.toString();

            mMeasure = new PathMeasure(mPath, false);
            mLength = mMeasure.getLength();
            
            mLines = new float[100 * 4];
            mPos = new float[2];
            mTan = new float[2];
        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            canvas.drawARGB(255, 255, 255, 255);

            canvas.save();
            canvas.translate(400.0f, 350.0f);
            mPaint.setTextAlign(Paint.Align.LEFT);
            canvas.drawTextOnPath(mText + mText, mPath, 0.0f, 0.0f, mPaint);
            canvas.drawPath(mPath, mPathPaint);
            
            for (int i = 0; i < 100; i++) {
                mMeasure.getPosTan(i * mLength / 100.0f, mPos, mTan);
                mLines[i * 4    ] = mPos[0];
                mLines[i * 4 + 1] = mPos[1];
                mLines[i * 4 + 2] = mPos[0] + mTan[1] * 15;
                mLines[i * 4 + 3] = mPos[1] - mTan[0] * 15;
            }
            canvas.drawLines(mLines, mPathPaint);
            
            canvas.translate(200.0f, 0.0f);
            canvas.drawTextOnPath(mText + mText, mStraightPath, 0.0f, 0.0f, mPaint);
            canvas.drawPath(mStraightPath, mPathPaint);

            canvas.restore();

            canvas.save();
            canvas.translate(150.0f, 60.0f);
            canvas.drawTextOnPath(mText, mPath, 0.0f, 10.0f, mPaint);
            mMeasure.getPosTan(5.0f, mPos, mTan);
            canvas.drawLine(mPos[0], mPos[1], mPos[0] + mTan[1] * 10, mPos[1] - mTan[0] * 10,
                    mPathPaint);
            canvas.drawPath(mPath, mPathPaint);

            canvas.translate(250.0f, 0.0f);
            mPaint.setTextAlign(Paint.Align.CENTER);
            canvas.drawTextOnPath(mText, mPath, 0.0f, 0.0f, mPaint);
            canvas.drawPath(mPath, mPathPaint);

            canvas.translate(250.0f, 0.0f);
            mPaint.setTextAlign(Paint.Align.RIGHT);
            canvas.drawTextOnPath(mText, mPath, 0.0f, 0.0f, mPaint);
            canvas.drawPath(mPath, mPathPaint);
            canvas.restore();
        }
    }
}
