/** * ParsedPathVGField.java * * Copyright � 1998-2011 Research In Motion Limited * * 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. * * Note: For the sake of simplicity, this sample application may not leverage * resource bundles and resource strings. However, it is STRONGLY recommended * that application developers make use of the localization features available * within the BlackBerry development platform to ensure a seamless application * experience across a variety of languages and geographies. For more information * on localizing your application, please refer to the BlackBerry Java Development * Environment Development Guide associated with this release. */ package com.rim.samples.device.openvgdemo; import net.rim.device.api.openvg.VG; import net.rim.device.api.openvg.VG10; import net.rim.device.api.openvg.VG11; import net.rim.device.api.openvg.VGField; import net.rim.device.api.openvg.VGUtils; import net.rim.device.api.system.Display; import net.rim.device.api.ui.Font; import net.rim.device.api.ui.FontSpec; /** * A VGField class that demonstrates drawing of path information read from a * text file and displays the resulting image on the screen. The class also uses * Open VG to draw a textual description on the screen. */ public class ParsedPathVGField extends VGField { private static final int TEXT_OFFSET = 30; private static final float PATHS_IMAGE_HEIGHT = 600.0f; private static final float PATHS_IMAGE_WIDTH = 600.0f; private static final float[] MY_CLEAR_COLOR = new float[] { 0.6f, 0.8f, 1.0f, 1.0f }; private int _textImage; private int _displayWidth; private int _displayHeight; private Path[] _svgPathsArray; /** * Creates a new ParsedPathVGField object */ public ParsedPathVGField() { super(VGField.VERSION_1_1); } /** * @see net.rim.device.api.openvg.VGField#initialize(VG) */ protected void initialize(final VG vg) { // Code to initialize an OpenVG resource final VG11 vg11 = (VG11) vg; vg11.vgSetfv(VG10.VG_CLEAR_COLOR, 4, MY_CLEAR_COLOR, 0); // Read paths from file final PathFileReader pathReader = new PathFileReader(); _svgPathsArray = pathReader.getPaths(vg11, "/res/paths.txt"); // Get the default Font and its FontSpec final Font font = Font.getDefault(); final FontSpec fontSpec = font.getFontSpec(); // Create text images _textImage = VGUtils.vgCreateTextAsImage(vg, fontSpec, "Tap or click to swap screens", null, null); } /** * @see net.rim.device.api.openvg.VGField#render(VG) */ protected void render(final VG renderer) { final VG11 vg11 = (VG11) renderer; // Clear the display from the last time it was rendered vg11.vgClear(0, 0, getWidth(), getHeight()); // Draw the text images on this field drawText(vg11); // Set VG_MATRIX_MODE to VG_MATRIX_PATH_USER_TO_SURFACE vg11.vgSeti(VG10.VG_MATRIX_MODE, VG10.VG_MATRIX_PATH_USER_TO_SURFACE); // Load a clean identity matrix vg11.vgLoadIdentity(); // Calculate scale factor final float scaleFactor = Math.min(_displayHeight / PATHS_IMAGE_HEIGHT, _displayWidth / PATHS_IMAGE_WIDTH); // Calculate x position final float xPos = (_displayWidth - PATHS_IMAGE_WIDTH * scaleFactor) / 2; // Move the y position to just below the text that was drawn final int yPos = _displayHeight - (TEXT_OFFSET + 5); // Translate to origin corresponding to SVG (top left) vg11.vgTranslate(xPos, yPos); // Scale the image vg11.vgScale(scaleFactor, -scaleFactor); // Draw the image on the screen drawPaths(vg11, _svgPathsArray); } /** * Draws text at the top of the VGField * * @param vg * The object that will be used to render the text */ public void drawText(final VG11 vg) { vg.vgSeti(VG10.VG_MATRIX_MODE, VG10.VG_MATRIX_IMAGE_USER_TO_SURFACE); // Load a clean identity matrix vg.vgLoadIdentity(); // Translate to correct drawing location vg.vgTranslate(0.0f, _displayHeight - TEXT_OFFSET); // Draw the text on the display vg.vgDrawImage(_textImage); } /** * @see net.rim.device.api.openvg.VGField#layout(int, int) */ protected void layout(final int width, final int height) { _displayWidth = Display.getWidth(); _displayHeight = Display.getHeight(); setExtent(Math.min(_displayWidth, width), Math.min(_displayHeight, height)); } /** * Draws the paths read from the paths.txt file onto the display * * @param vg * VG object that will be used to render the paths * @param paths * Paths read from paths.txt that will be drawn to the display */ private void drawPaths(final VG11 vg, final Path[] paths) { // Go through the array containing all paths // and draw each one to the screen. for (int i = 0, length = paths.length; i < length; i++) { final Path path = paths[i]; path.draw(vg); } } }