staticanimation.java.svn-base

来自「j2me设计的界面包」· SVN-BASE 代码 · 共 552 行 · 第 1/2 页

SVN-BASE
552
字号
                // for performance we can calculate the visible drawing area so we don't have to        // calculate the whole array        int clipY = g.getClipY();        int clipBottomY = g.getClipHeight() + clipY;        int firstLine = 0;        int lastLine = getHeight();        if(clipY > y) {            firstLine = clipY - y;        }         if(clipBottomY < y + getHeight()) {            lastLine = clipBottomY - y;        }                Frame f = frames[currentFrame - 1];        byte[] imageDataByte = f.getKeyFrame();        int[] palette = getPalette();                // we draw based on the last keyframe and if a row was modified then we        // will draw that row rather than the keyframe        for(int line = firstLine ; line < lastLine ; line += 1) {            byte[] lineArray = f.getModifiedRow(line);            if(lineArray != null) {                for(int position = 0 ; position < width ; position++) {                    int i = lineArray[position] & 0xff;                                    lineCache[position] = palette[i];                }            } else {                //if(!f.isDrawPrevious()) {                    int currentPos = line * width;                    for(int position = 0 ; position < width ; position++) {                        int i = imageDataByte[position + currentPos] & 0xff;                                        lineCache[position] = palette[i];                    }                //}            }            g.drawRGB(lineCache, 0, width, x, y + line, width, 1, true);        }    }            /**     * @inheritDoc     */    public void scale(int width, int height) {        StaticAnimation s = (StaticAnimation)scaled(width, height);        super.scale(width, height);        frames = s.frames;    }        /**     * @inheritDoc     */    public Image scaled(int width, int height) {        int srcWidth = getWidth();        int srcHeight = getHeight();        // no need to scale        if(srcWidth == width && srcHeight == height){            return this;        }        // save the previous keyframe all the time this allows us to swap a keyframe        // based on its pointer rather than scale it twice        byte[] lastKeyFrame = getImageDataByte();        // scale the first frame        StaticAnimation result = new StaticAnimation(width, height, getPalette(), scaleArray(lastKeyFrame, width, height));        result.loop = loop;        result.totalAnimationTime = totalAnimationTime;        result.animationStartTime = animationStartTime;        result.currentFrame = currentFrame;        result.frames = new Frame[frames.length];                byte[] lastKeyFrameAfterScale = result.getImageDataByte();                int yRatio = (srcHeight << 16) / height;        int xRatio = (srcWidth << 16) / width;        // now we need to traverse all the frames and scale them one by one        for(int iter = 0 ; iter < frames.length ; iter++) {            byte[] currentKeyFrame = frames[iter].getKeyFrame();            if(currentKeyFrame != lastKeyFrame) {                lastKeyFrame = currentKeyFrame;                currentKeyFrame = scaleArray(currentKeyFrame, width, height);                lastKeyFrameAfterScale = currentKeyFrame;            }            result.frames[iter] = new Frame(frames[iter].getTime(), lastKeyFrameAfterScale, frames[iter], xRatio, yRatio, width, height);        }        return result;    }        /**     * @inheritDoc     */    public boolean isAnimation() {        return true;    }        /**     * Used by the resource editor     */    boolean isKeyframe(int offset) {        if(offset == 0) {            return true;        }        if(offset == 1) {            return frames[offset - 1].getKeyFrame() != imageDataByte;        }        return frames[offset - 1].getKeyFrame() != frames[offset - 2].getKeyFrame();    }        /**     * Used by the resource editor     */    byte[] getKeyframe(int offset) {        return frames[offset - 1].getKeyFrame();    }    /**     * Used by the resource editor     */    boolean isDrawPrevious(int offset) {        return frames[offset - 1].isDrawPrevious();    }        /**     * Used by the resource editor     */    byte[][] getModifiedRows(int offset) {        return frames[offset - 1].modifiedRows;    }        /**     * Used by the resource editor     */    int[] getModifiedRowOffsets(int offset) {        return frames[offset - 1].modifiedRowOffsets;    }        Rectangle getDirtyRegion(){        int frame = currentFrame;        if(frame == 0){            return null;        }        if(frame == frames.length){            frame = 0;        }        int [] modified = frames[frame].modifiedRowOffsets;        Rectangle rect = new Rectangle(0, frames[frame].smallestChangedRow, new Dimension(getWidth(), frames[frame].highestChangedRow -frames[frame].smallestChangedRow));        return rect;    }        /**     * Represents a frame within the animation that is not the first frame     */    static class Frame {        /**         * Offset since the beginning of the animation         */        private int time;                private byte[] keyFrame;                /**         * Relevant only for standard frames, this represents the rows that         * were modified for this specific frame         */        byte[][] modifiedRows;        int[] modifiedRowOffsets;        private boolean drawPrevious;        int smallestChangedRow;        int highestChangedRow;                        public Frame(int time, byte[] keyFrame, Vector rowNumbers, Vector rowValues, boolean drawPrevious) {            this.time = time;            this.keyFrame = keyFrame;            this.drawPrevious = drawPrevious;            initArrays(rowNumbers, rowValues);        }        private void initArrays(Vector rowNumbers, Vector rowValues) {            modifiedRowOffsets = new int[rowNumbers.size()];            modifiedRows = new byte[modifiedRowOffsets.length][];            for(int iter = 0 ; iter < modifiedRowOffsets.length ; iter++) {                modifiedRowOffsets[iter] = ((Integer)rowNumbers.elementAt(iter)).intValue();                modifiedRows[iter] = (byte[])rowValues.elementAt(iter);            }            smallestChangedRow = modifiedRowOffsets[0];            highestChangedRow = modifiedRowOffsets[0];            for(int i=1;i<modifiedRowOffsets.length;i++){                smallestChangedRow = Math.min(smallestChangedRow, modifiedRowOffsets[i]) ;                highestChangedRow = Math.max(highestChangedRow, modifiedRowOffsets[i]) ;            }        }                public Frame(int time, byte[] keyFrame) {            this.time = time;            this.keyFrame = keyFrame;            modifiedRowOffsets = new int[0];        }                /**         * This constructor is used for scaling the original frame according to the given ratios         */        public Frame(int time, byte[] keyFrame, Frame original, int xRatio, int yRatio, int width, int height) {            this.time = time;            this.keyFrame = keyFrame;                        // if the original was a keyframe then no work...            if(original.modifiedRowOffsets.length == 0) {                modifiedRowOffsets = original.modifiedRowOffsets;                return;            }            Vector newRows = new Vector();            Vector newValues = new Vector();                        int xPos = xRatio / 2;            int yPos = yRatio / 2;            for(int y = 0 ; y < height ; y++) {                int srcY = yPos >> 16;                                // do we have the row at srcY???                int rowAtY = -1;                for(int iter = 0 ; iter < original.modifiedRowOffsets.length ; iter++) {                    if(original.modifiedRowOffsets[iter] == srcY) {                        rowAtY = iter;                        break;                    }                }                if(rowAtY != -1) {                    byte[] newRow = new byte[width];                    for (int x = 0; x < width; x++) {                        int srcX = xPos >> 16;                        newRow[x] = original.modifiedRows[rowAtY][srcX];                        xPos += xRatio;                    }                    newRows.addElement(new Integer(y));                    newValues.addElement(newRow);                }                yPos += yRatio;                xPos = xRatio / 2;            }                        initArrays(newRows, newValues);        }                public boolean isDrawPrevious() {            return drawPrevious;        }                public int getTime() {            return time;        }                private byte[] getModifiedRow(int row) {            for(int iter = 0 ; iter < modifiedRowOffsets.length ; iter++) {                if(modifiedRowOffsets[iter] == row) {                    return modifiedRows[iter];                }            }            return null;        }                private byte[] getKeyFrame() {            return keyFrame;        }                private void setKeyFrame(byte[] keyFrame) {            this.keyFrame = keyFrame;        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?