Home | History | Annotate | Download | only in graphics
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics;
     18 
     19 import org.eclipse.swt.graphics.ImageData;
     20 
     21 /**
     22  * The utility class for SWT Image and ImageData manipulation.
     23  */
     24 public class GraphicsUtilities {
     25 
     26     /**
     27      * Convert normal image to 9-patched.
     28      * @return Returns 9-patched ImageData object. If image is null, returns null.
     29      */
     30     public static ImageData convertToNinePatch(ImageData image) {
     31         if (image == null) {
     32             return null;
     33         }
     34         ImageData result = new ImageData(image.width + 2, image.height + 2, image.depth,
     35                 image.palette);
     36 
     37         final int[] colors = new int[image.width];
     38         final byte[] alpha = new byte[image.width];
     39 
     40         for (int y = 0; y < image.height; y++) {
     41 
     42             // Copy pixels
     43             image.getPixels(0, y, image.width, colors, 0);
     44             result.setPixels(1, y + 1, image.width, colors, 0);
     45 
     46             // Copy alpha
     47             image.getAlphas(0, y, image.width, alpha, 0);
     48             result.setAlphas(1, y + 1, image.width, alpha, 0);
     49         }
     50 
     51         return result;
     52     }
     53 
     54     /**
     55      * Wipe all color and alpha pixels.
     56      */
     57     public static void clearImageData(ImageData imageData) {
     58         if (imageData == null) {
     59             throw new IllegalArgumentException("image data must not be null");
     60         }
     61         int width = imageData.width;
     62         int height = imageData.height;
     63         for (int y = 0; y < height; y++) {
     64             for (int x = 0; x < width; x++) {
     65                 imageData.setPixel(x, y, 0x00000000);
     66                 imageData.setAlpha(x, y, 0x00);
     67             }
     68         }
     69     }
     70 
     71     /**
     72      * Duplicate the image data.
     73      * @return If image is null, return null.
     74      */
     75     public static ImageData copy(ImageData image) {
     76         if (image == null) {
     77             return null;
     78         }
     79         ImageData result = new ImageData(image.width, image.height, image.depth,
     80                 image.palette);
     81 
     82         final int[] colors = new int[image.width];
     83         final byte[] alpha = new byte[image.width];
     84 
     85         for (int y = 0; y < image.height; y++) {
     86 
     87             // Copy pixels
     88             image.getPixels(0, y, image.width, colors, 0);
     89             result.setPixels(0, y, image.width, colors, 0);
     90 
     91             // Copy alpha
     92             image.getAlphas(0, y, image.width, alpha, 0);
     93             result.setAlphas(0, y, image.width, alpha, 0);
     94         }
     95 
     96         return result;
     97     }
     98 
     99     /**
    100      * Get column pixels.
    101      * @return length of obtained pixels.
    102      */
    103     public static int getVerticalPixels(ImageData data, int x, int y, int height, int[] out) {
    104         if (data == null) {
    105             throw new IllegalArgumentException("data must not be null");
    106         }
    107         if (out == null) {
    108             throw new IllegalArgumentException("out array must not be null");
    109         }
    110         if (height > out.length) {
    111             throw new IllegalArgumentException("out array length must be > height");
    112         }
    113         if (data.height < (y + height)) {
    114             throw new IllegalArgumentException("image height must be > (y + height)");
    115         }
    116         if (x < 0 || y < 0) {
    117             throw new IllegalArgumentException("argument x, y must be >= 0");
    118         }
    119         if (x >= data.width) {
    120             throw new IllegalArgumentException("argument x must be < data.width");
    121         }
    122         if (y >= data.height) {
    123             throw new IllegalArgumentException("argument y must be < data.height");
    124         }
    125         if (height <= 0) {
    126             throw new IllegalArgumentException("argument height must be > 0");
    127         }
    128 
    129         int idx = 0;
    130         while (idx < height) {
    131             data.getPixels(x, (y + idx), 1, out, idx);
    132             idx++;
    133         }
    134         return idx;
    135     }
    136 
    137     /**
    138      * Get row pixels.
    139      */
    140     public static void getHorizontalPixels(ImageData data, int x, int y, int width, int[] out) {
    141         if (data == null) {
    142             throw new IllegalArgumentException("data must not be null");
    143         }
    144         if (out == null) {
    145             throw new IllegalArgumentException("out array must not be null");
    146         }
    147         if (width > out.length) {
    148             throw new IllegalArgumentException("out array length must be > width");
    149         }
    150         if (data.width < (x + width)) {
    151             throw new IllegalArgumentException("image height must be > (x + width)");
    152         }
    153         if (x < 0 || y < 0) {
    154             throw new IllegalArgumentException("argument x, y must be >= 0");
    155         }
    156         if (x >= data.width) {
    157             throw new IllegalArgumentException("argument x must be < data.width");
    158         }
    159         if (y >= data.height) {
    160             throw new IllegalArgumentException("argument y must be < data.height");
    161         }
    162         if (width <= 0) {
    163             throw new IllegalArgumentException("argument width must be > 0");
    164         }
    165 
    166         data.getPixels(x, y, width, out, 0);
    167     }
    168 
    169 }
    170