/*******************************************************************************
 * Copyright 2011 See AUTHORS file.
 * 
 * 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.badlogic.gdx.tests;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputAdapter;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.BitmapFontCache;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.tests.utils.GdxTest;
import com.badlogic.gdx.utils.Align;

public class BitmapFontFlipTest extends GdxTest {
	private SpriteBatch spriteBatch;
	private Texture texture;
	private BitmapFont font;
	private Sprite logoSprite;
	private Color red = new Color(1, 0, 0, 0);
	private BitmapFontCache cache1, cache2, cache3, cache4, cache5;
	private BitmapFontCache cacheScaled1, cacheScaled2, cacheScaled3, cacheScaled4, cacheScaled5;
	int renderMode;

	@Override
	public void create () {
		Gdx.input.setInputProcessor(new InputAdapter() {
			public boolean touchDown (int x, int y, int pointer, int newParam) {
				renderMode = (renderMode + 1) % 4;
				return false;
			}
		});

		spriteBatch = new SpriteBatch();
		spriteBatch.setProjectionMatrix(new Matrix4().setToOrtho(0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), 0, 0, 1));

		texture = new Texture(Gdx.files.internal("data/badlogic.jpg"));
		logoSprite = new Sprite(texture);
		logoSprite.flip(false, true);
		logoSprite.setPosition(0, 320 - 256);
		logoSprite.setColor(1, 1, 1, 0.5f);

		font = new BitmapFont(Gdx.files.internal("data/verdana39.fnt"), Gdx.files.internal("data/verdana39.png"), true);

		cache1 = font.newFontCache();
		cache2 = font.newFontCache();
		cache3 = font.newFontCache();
		cache4 = font.newFontCache();
		cache5 = font.newFontCache();
		createCaches("cached", cache1, cache2, cache3, cache4, cache5);

		font.getData().setScale(1.33f);
		cacheScaled1 = font.newFontCache();
		cacheScaled2 = font.newFontCache();
		cacheScaled3 = font.newFontCache();
		cacheScaled4 = font.newFontCache();
		cacheScaled5 = font.newFontCache();
		createCaches("cache scaled", cacheScaled1, cacheScaled2, cacheScaled3, cacheScaled4, cacheScaled5);
	}

	private void createCaches (String type, BitmapFontCache cache1, BitmapFontCache cache2, BitmapFontCache cache3,
		BitmapFontCache cache4, BitmapFontCache cache5) {
		cache1.setText("(" + type + ")", 10, 320 - 66);

		String text = "Sphinx of black quartz,\njudge my vow.";
		cache2.setColor(Color.RED);
		cache2.setText(text, 5, 320 - 300);

		text = "How quickly\ndaft jumping zebras vex.";
		cache3.setColor(Color.BLUE);
		cache3.setText(text, 5, 320 - 200, 470, Align.center, false);

		text = "Kerning: LYA moo";
		cache4.setText(text, 210, 320 - 66, 0, text.length() - 3, 0, Align.left, false);

		text = "Forsaking monastic tradition, twelve jovial friars gave\nup their vocation for a questionable existence on the flying trapeze.";
		cache5.setColor(red);
		cache5.setText(text, 0, 320 - 300, 480, Align.center, false);
	}

	@Override
	public void render () {
		red.a = (red.a + Gdx.graphics.getDeltaTime() * 0.1f) % 1;

		Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
		spriteBatch.begin();
		logoSprite.draw(spriteBatch);
		switch (renderMode) {
		case 0:
			font.getData().setScale(1);
			renderNormal("normal");
			break;
		case 1:
			font.getData().setScale(1);
			renderCached();
			break;
		case 2:
			font.getData().setScale(red.a + 0.5f);
			renderNormal("normal scaled");
			break;
		case 3:
			font.getData().setScale(1);
			renderCachedScaled();
			break;
		}
		spriteBatch.end();
	}

	private void renderNormal (String type) {
		String text = "Forsaking monastic tradition, twelve jovial friars gave\nup their vocation for a questionable existence on the flying trapeze.";
		font.setColor(red);
		font.draw(spriteBatch, text, 0, 320 - 300, 480, Align.center, false);

		font.setColor(Color.WHITE);
		font.draw(spriteBatch, "(" + type + ")", 10, 320 - 66);

		if (red.a > 0.6f) return;

		text = "Sphinx of black quartz,\njudge my vow.";
		font.setColor(Color.RED);
		font.draw(spriteBatch, text, 5, 320 - 300);

		text = "How quickly\ndaft jumping zebras vex.";
		font.setColor(Color.BLUE);
		font.draw(spriteBatch, text, 5, 320 - 200, 470, Align.right, false);

		text = "Kerning: LYA moo";
		font.setColor(Color.WHITE);
		font.draw(spriteBatch, text, 210, 320 - 66, 0, text.length() - 3, 0, Align.left, false);
	}

	private void renderCached () {
		cache5.setColors(red);
		cache5.draw(spriteBatch);

		cache1.draw(spriteBatch);

		if (red.a > 0.6f) return;

		cache2.draw(spriteBatch);
		cache3.draw(spriteBatch);
		cache4.draw(spriteBatch);
	}

	private void renderCachedScaled () {
		cacheScaled5.setColors(red);
		cacheScaled5.draw(spriteBatch);

		cacheScaled1.draw(spriteBatch);

		if (red.a > 0.6f) return;

		cacheScaled2.draw(spriteBatch);
		cacheScaled3.draw(spriteBatch);
		cacheScaled4.draw(spriteBatch);
	}

	@Override
	public void dispose () {
		spriteBatch.dispose();
		font.dispose();
		texture.dispose();
	}
}
