com.alibaba.simpleimage.render.FixDrawTextItem.java Source code

Java tutorial

Introduction

Here is the source code for com.alibaba.simpleimage.render.FixDrawTextItem.java

Source

/*
 * Copyright 1999-2101 Alibaba Group.
 *
 * 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.alibaba.simpleimage.render;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;

import org.apache.commons.lang.StringUtils;

import com.alibaba.simpleimage.font.FontManager;

/**
 * CenterDrawTextItem.java??TODO ??
 * 
 * @author wendell 2011-3-28 ?02:03:40
 */
public class FixDrawTextItem extends DrawTextItem {

    static final Color FONT_COLOR = new Color(255, 255, 255, 115);
    static final Color FONT_SHADOW_COLOR = new Color(170, 170, 170, 77);
    static final Font FONT = FontManager.getFont("");
    static final float DEFAULT_TEXT_WIDTH_PERCENT = 0.85F;

    public enum Position {
        CENTER, TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT
    }

    protected float textWidthPercent;
    protected Position position;

    /**
     * @param text
     */
    public FixDrawTextItem(String text) {
        super(text, FONT_COLOR, FONT_SHADOW_COLOR, FONT, MIN_FONT_SIZE);
        this.position = Position.CENTER;
        this.textWidthPercent = DEFAULT_TEXT_WIDTH_PERCENT;
    }

    /**
     * @param text
     * @param fontColor
     * @param fontShadowColor
     * @param defaultFont
     * @param minFontSize
     */
    public FixDrawTextItem(String text, Position position, float textWidthPercent) {
        super(text, FONT_COLOR, FONT_SHADOW_COLOR, FONT, MIN_FONT_SIZE);
        this.position = position;
        this.textWidthPercent = textWidthPercent;
    }

    /**
     * @param text
     * @param fontColor
     * @param fontShadowColor
     * @param font
     * @param minFontSize
     */
    public FixDrawTextItem(String text, Color fontColor, Color fontShadowColor, Font font, int minFontSize,
            Position position, float textWidthPercent) {
        super(text, fontColor, fontShadowColor, font, minFontSize);
        this.position = position;
        this.textWidthPercent = textWidthPercent;
    }

    /*
     * (non-Javadoc)
     * @see com.alibaba.simpleimage.render.DrawTextItem#drawText(java.awt.Graphics2D, int, int)
     */
    @Override
    public void drawText(Graphics2D graphics, int width, int height) {
        if (StringUtils.isBlank(text)) {
            return;
        }

        int x = 0, y = 0;
        int fontsize = 1;
        if (position == Position.CENTER) {
            // ?
            int textLength = (int) (width * textWidthPercent);
            // ??
            fontsize = textLength / text.length();
            // ?.....?
            if (fontsize < minFontSize) {
                return;
            }

            float fsize = (float) fontsize;
            Font font = defaultFont.deriveFont(fsize);
            graphics.setFont(font);
            FontRenderContext context = graphics.getFontRenderContext();
            int sw = (int) font.getStringBounds(text, context).getWidth();

            // ??
            x = (width - sw) / 2;
            y = height / 2 + fontsize / 2;
        } else if (position == Position.TOP_LEFT) {
            fontsize = ((int) (width * textWidthPercent)) / text.length();
            if (fontsize < minFontSize) {
                return;
            }

            float fsize = (float) fontsize;
            Font font = defaultFont.deriveFont(fsize);
            graphics.setFont(font);

            x = fontsize;
            y = fontsize * 2;
        } else if (position == Position.TOP_RIGHT) {
            fontsize = ((int) (width * textWidthPercent)) / text.length();
            if (fontsize < minFontSize) {
                return;
            }

            float fsize = (float) fontsize;
            Font font = defaultFont.deriveFont(fsize);
            graphics.setFont(font);
            FontRenderContext context = graphics.getFontRenderContext();
            int sw = (int) font.getStringBounds(text, context).getWidth();

            x = width - sw - fontsize;
            y = fontsize * 2;
        } else if (position == Position.BOTTOM_LEFT) {
            fontsize = ((int) (width * textWidthPercent)) / text.length();
            if (fontsize < minFontSize) {
                return;
            }

            float fsize = (float) fontsize;
            Font font = defaultFont.deriveFont(fsize);
            graphics.setFont(font);

            x = fontsize / 2;
            y = height - fontsize;
        } else if (position == Position.BOTTOM_RIGHT) {
            fontsize = ((int) (width * textWidthPercent)) / text.length();
            if (fontsize < minFontSize) {
                return;
            }

            float fsize = (float) fontsize;
            Font font = defaultFont.deriveFont(fsize);
            graphics.setFont(font);
            FontRenderContext context = graphics.getFontRenderContext();
            int sw = (int) font.getStringBounds(text, context).getWidth();

            x = width - sw - fontsize;
            y = height - fontsize;
        } else {
            throw new IllegalArgumentException("Unknown position : " + position);
        }

        if (x <= 0 || y <= 0) {
            return;
        }

        if (fontShadowColor != null) {
            graphics.setColor(fontShadowColor);
            graphics.drawString(text, x + getShadowTranslation(fontsize), y + getShadowTranslation(fontsize));
        }

        graphics.setColor(fontColor);
        graphics.drawString(text, x, y);
    }

    /**
     * @return the textWidthPercent
     */
    public float getTextWidthPercent() {
        return textWidthPercent;
    }

    /**
     * @return the position
     */
    public Position getPosition() {
        return position;
    }

    /**
     * @param textWidthPercent the textWidthPercent to set
     */
    public void setTextWidthPercent(float textWidthPercent) {
        this.textWidthPercent = textWidthPercent;
    }

    /**
     * @param position the position to set
     */
    public void setPosition(Position position) {
        this.position = position;
    }
}