org.eclipse.swt.examples.graphics.CardsTab.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.swt.examples.graphics.CardsTab.java

Source

/*******************************************************************************
 * Copyright (c) 2006, 2016 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.swt.examples.graphics;

import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Transform;

/**
 * This tab demonstrates various transformations, such as scaling, rotation, and
 * translation.
 */
public class CardsTab extends AnimatedGraphicsTab {

    float movClubX, movClubY, movDiamondX, movDiamondY, movHeart, movSpade;
    float inc_club = 5.0f;
    float inc_diamond = 5.0f;
    float inc_hearts = 5.0f;
    float inc_spade = 5.0f;
    float scale, scaleWidth;
    int rotationAngle = 0;
    float scaleArg = 0;
    float heartScale = 0.5f;
    float spadeScale = 0.333f;
    int clubWidth, diamondWidth, heartWidth, spadeHeight;

    Image ace_club, ace_spade, ace_diamond, ace_hearts;

    /**
     * Constructor
     * @param example A GraphicsExample
     */
    public CardsTab(GraphicsExample example) {
        super(example);
    }

    @Override
    public String getCategory() {
        return GraphicsExample.getResourceString("Transform"); //$NON-NLS-1$
    }

    @Override
    public String getText() {
        return GraphicsExample.getResourceString("Cards"); //$NON-NLS-1$
    }

    @Override
    public String getDescription() {
        return GraphicsExample.getResourceString("CardsDescription"); //$NON-NLS-1$
    }

    @Override
    public void dispose() {
        if (ace_club != null) {
            ace_club.dispose();
            ace_club = null;
            ace_spade.dispose();
            ace_spade = null;
            ace_diamond.dispose();
            ace_diamond = null;
            ace_hearts.dispose();
            ace_hearts = null;
        }
    }

    @Override
    public void next(int width, int height) {
        rotationAngle = (rotationAngle + 10) % 360;

        // scaleVal goes from 0 to 1, then 1 to 0, then starts over
        scaleArg = (float) ((scaleArg == 1) ? scaleArg - 0.1 : scaleArg + 0.1);
        scale = (float) Math.cos(scaleArg);

        movClubX += inc_club;
        movDiamondX += inc_diamond;
        movHeart += inc_hearts;
        movSpade += inc_spade;

        scaleWidth = (float) ((movClubY / height) * 0.35 + 0.15);
        movClubY = 2 * height / 5 * (float) Math.sin(0.01 * movClubX - 90) + 2 * height / 5;
        movDiamondY = 2 * height / 5 * (float) Math.cos(0.01 * movDiamondX) + 2 * height / 5;

        if (movClubX + clubWidth * scaleWidth > width) {
            movClubX = width - clubWidth * scaleWidth;
            inc_club = -inc_club;
        }
        if (movClubX < 0) {
            movClubX = 0;
            inc_club = -inc_club;
        }
        if (movDiamondX + diamondWidth * scaleWidth > width) {
            movDiamondX = width - diamondWidth * scaleWidth;
            inc_diamond = -inc_diamond;
        }
        if (movDiamondX < 0) {
            movDiamondX = 0;
            inc_diamond = -inc_diamond;
        }
        if (movHeart + heartWidth * heartScale > width) {
            movHeart = width - heartWidth * heartScale;
            inc_hearts = -inc_hearts;
        }
        if (movHeart < 0) {
            movHeart = 0;
            inc_hearts = -inc_hearts;
        }
        if (movSpade + spadeHeight * spadeScale > height) {
            movSpade = height - spadeHeight * spadeScale;
            inc_spade = -inc_spade;
        }
        if (movSpade < 0) {
            movSpade = 0;
            inc_spade = -inc_spade;
        }
    }

    @Override
    public void paint(GC gc, int width, int height) {
        if (!example.checkAdvancedGraphics())
            return;
        Device device = gc.getDevice();

        if (ace_club == null) {
            ace_club = GraphicsExample.loadImage(device, GraphicsExample.class, "ace_club.jpg");
            ace_spade = GraphicsExample.loadImage(device, GraphicsExample.class, "ace_spade.jpg");
            ace_diamond = GraphicsExample.loadImage(device, GraphicsExample.class, "ace_diamond.jpg");
            ace_hearts = GraphicsExample.loadImage(device, GraphicsExample.class, "ace_hearts.jpg");
        }

        clubWidth = ace_club.getBounds().width;
        diamondWidth = ace_diamond.getBounds().width;
        heartWidth = ace_hearts.getBounds().width;
        spadeHeight = ace_spade.getBounds().height;

        Transform transform;

        // ace of clubs
        transform = new Transform(device);
        transform.translate((int) movClubX, (int) movClubY);
        transform.scale(scaleWidth, scaleWidth);

        // rotate on center of image
        Rectangle rect = ace_club.getBounds();
        transform.translate(rect.width / 2, rect.height / 2);
        transform.rotate(rotationAngle);
        transform.translate(-rect.width / 2, -rect.height / 2);

        gc.setTransform(transform);
        transform.dispose();
        gc.drawImage(ace_club, 0, 0);

        // ace of diamonds
        transform = new Transform(device);
        transform.translate((int) movDiamondX, (int) movDiamondY);
        transform.scale(scaleWidth, scaleWidth);
        gc.setTransform(transform);
        transform.dispose();
        gc.drawImage(ace_diamond, 0, 0);

        // ace of hearts
        transform = new Transform(device);
        transform.translate(movHeart, height / 2);
        transform.scale(heartScale, 0.5f * scale);
        gc.setTransform(transform);
        transform.dispose();
        gc.drawImage(ace_hearts, 0, 0);

        // ace of spades
        transform = new Transform(device);
        transform.translate(movSpade, movSpade);
        transform.scale(0.5f * scale, spadeScale);
        gc.setTransform(transform);
        transform.dispose();
        gc.drawImage(ace_spade, 0, 0);
    }
}