⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 displaylist.java

📁 j2me 上面flash播放器。非常值得研究。就是版本只到2.0
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
package org.jflashme;/*  This library is free software; you can redistribute it and/or modify it *  under the terms of the GNU Lesser General Public License, version 2, as *  published by the Free Software Foundation. * *  This library is distributed in the hope that it will be useful, but *  WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU *  Lesser General Public License (the accompanying file named LGPL.txt) *  for more details. */import javax.microedition.lcdui.*;final class DisplayList{   private Matrix cameraMat;   private int backgroundColor;   private int backgroundColorPriority;   boolean antialias;   private Rect devDirtyRgn;   private SObject objects;   private FlashPane flash;   SObject button;   int buttonState;   private int buttonId;   static final int showAll = 0;   static final int noBorder = 1;   static final int exactFit = 2;   static final int scaleMask = 15;   static final int alignLeft = 16;   static final int alignRight = 32;   static final int alignTop = 64;   static final int alignBottom = 128;   boolean indexedColor;//   ColorModel model;   private int width;   private int height;   private Rect bitClip;   private Rect edgeClip;   private int pixelSize;   private int pixelOrg;   byte pixels8[];   int pixels32[];   private int topColorXleft;   private RColor topColor;   private RColor activeColors;   private REdge activeEdges[];   private int nActive;   private int maxActive;   private REdge yindex[];   private int ylines;   private int y;   int bitY;   private RRun firstRun;   private RRun curRun;   RRun runPool;   private long rgb;   private int pixelX;   private int pixelW;   private int pbufWidth;   private int pbufTop;   private int pbufNLines;   private int pbufMaxLines;   private int nColors;   private int ctab[];   private byte itab[];   private int nEmpty;   private int error[];   boolean forceCompleteScanlines;  // ImageConsumer theConsumer;   boolean newConsumer;   Image   myImage;   DisplayList(FlashPane flash)       {       cameraMat = new Matrix();       backgroundColor = -1;       antialias = false;       devDirtyRgn = new Rect();       forceCompleteScanlines = false;       this.flash=flash;       }      Image getImage()      {      // ToDo: return a real image created out of the data handled here      return myImage;      }             void FreeAll()    {        for(SObject sobject = objects; sobject != null; sobject = sobject.next)            devDirtyRgn.union(sobject.devBounds);        objects = null;        button = null;        if(backgroundColorPriority <= 1)        {            backgroundColor = -1;            backgroundColorPriority = 0;        }    }   void setCamera(Rect rect,int quality, int scaleMode, boolean flag1)      {      Rect rect1 = new Rect(0, 0, width, height);      if (quality==FlashPane.NICEST)         {         rect1.xmax *= 4;         rect1.ymax *= 4;         }      Matrix matrix = new Matrix();      int j = Math.max(rect1.xmax - rect1.xmin, 16);      int k;      matrix.a = (int)(((long)j << 16) /(k = Math.max(rect.xmax - rect.xmin, 16)));      j = Math.max(rect1.ymax - rect1.ymin, 16);      matrix.d = (int)(((long)j << 16) /(k = Math.max(rect.ymax - rect.ymin, 16)));      switch(scaleMode & 0xf)         {         case 0: // '\0'         default:            matrix.a = matrix.d = Math.min(matrix.a, matrix.d);            break;         case 1: // '\001'            matrix.a = matrix.d = Math.max(matrix.a, matrix.d);            break;         }      int l;      if ((scaleMode & 0x10) != 0)         {         j = rect.xmin;         l = rect1.xmin;         }       else      if((scaleMode & 0x20) != 0)         {         j = rect.xmax;         l = rect1.xmax;         }       else         {         j = (rect.xmin + rect.xmax) / 2;         l = (rect1.xmin + rect1.xmax) / 2;         }      int i1;      if((scaleMode & 0x40) != 0)         {         k = rect.ymin;         i1 = rect1.ymin;         }       else      if ((scaleMode & 0x80) != 0)         {         k = rect.ymax;         i1 = rect1.ymax;         }       else         {         k = (rect.ymin + rect.ymax) / 2;         i1 = (rect1.ymin + rect1.ymax) / 2;         }      matrix.tx = l - (int)((long)j *matrix.a+ 32768L >> 16);      matrix.ty = i1 - (int)((long)k *matrix.a+ 32768L >> 16);      if(matrix.a != cameraMat.a || matrix.b != cameraMat.b || matrix.c != cameraMat.c || matrix.d != cameraMat.d || matrix.tx != cameraMat.tx || matrix.ty != cameraMat.ty || (antialias!=(quality==FlashPane.NICEST)))         {         if (quality==FlashPane.NICEST) antialias=true;         cameraMat = matrix;         modifyCamera();         }      if (flag1)         {         Rect rect2 = devDirtyRgn;         if (rect2.xmin != 0x80000000 && true)            {            produce(true);            return;            }         }      }          private void invalidate()    {        devDirtyRgn.xmin = devDirtyRgn.ymin = 0;        devDirtyRgn.xmax = width;        devDirtyRgn.ymax = height;        if(antialias)        {            devDirtyRgn.xmax *= 4;            devDirtyRgn.ymax *= 4;        }    }    private void modifyCamera()    {        invalidate();        for(SObject sobject = objects; sobject != null; sobject = sobject.next)        {            sobject.edges = null;            sobject.devMat = Matrix.concat(sobject.mat, cameraMat);            sobject.devBounds = sobject.devMat.transform(sobject.character.bounds);        }    }    void setBackgroundColor(int i, int j)    {        if(j >= backgroundColorPriority)        {            if(backgroundColor == i && j == backgroundColorPriority)                return;            invalidate();            backgroundColor = i;            backgroundColorPriority = j;        }    }           void placeObject(SCharacter scharacter, int ID,int depth,Matrix matrix, ColorTransform colortransform)      {      SObject sobject = new SObject();      sobject.next = objects;      objects = sobject;      sobject.display = this;      sobject.character = scharacter;      sobject.ID=ID;      sobject.depth=depth;      if (matrix!=null) sobject.mat=matrix;      else sobject.mat=new Matrix();      sobject.cx = colortransform;      if (scharacter.type==SCharacter.SCHAR_TYPE_BUTTON)         {         int j = 1;         if (ID==buttonId)            {            button = sobject;            j = buttonState;            }         updateButton(sobject, j);         sobject.devBounds = new Rect();         return;         }       else         {         sobject.devMat = Matrix.concat(sobject.mat, cameraMat);         sobject.devBounds = sobject.devMat.transform(scharacter.bounds);         devDirtyRgn.union(sobject.devBounds);         }      }/*    private SObject findObject(int i)    {        for(SObject sobject = objects; sobject != null; sobject = sobject.next)            if(sobject.id == i)                return sobject;        return null;    }*/    void removeObject(int ID,int depth)    {        SObject sobject = null;        for(SObject sobject1 = objects; sobject1 != null; sobject1 = sobject1.next)        {            if(sobject1.ID==ID)            {                if(sobject1.buttonState != 0)                {                    updateButton(sobject1, 0);                    removeObject(ID,depth);                    if(button == sobject1)                    {                        button = null;                        return;                    }                } else                {                    if(sobject1.drawn)                        devDirtyRgn.union(sobject1.devBounds);                    if(sobject != null)                    {                        sobject.next = sobject1.next;                        return;                    }                    objects = sobject1.next;                }                return;            }            sobject = sobject1;        }    }        void removeObject2(int depth)    {        SObject sobject = null;        for(SObject sobject1 = objects; sobject1 != null; sobject1 = sobject1.next)        {            if(sobject1.depth ==depth)            {                if(sobject1.buttonState != 0)                {                    updateButton(sobject1, 0);                    removeObject(sobject1.ID,sobject.depth);                    if(button == sobject1)                    {                        button = null;                        return;                    }                } else                {                    if(sobject1.drawn)                        devDirtyRgn.union(sobject1.devBounds);                    if(sobject != null)                    {                        sobject.next = sobject1.next;                        return;                    }                    objects = sobject1.next;                }                return;            }            sobject = sobject1;        }    }            private void updateButton(SObject sobject, int i)    {        int j = sobject.buttonState;        if(j == i)            return;        ScriptPlayer scriptplayer = sobject.character.player;        SParser sparser = new SParser();        int k = sobject.character.cxformPos;        ColorTransform colortransform = null;        SParser sparser1 = null;        if(k > 0)            sparser1 = new SParser();        for(int l = 0; l < 2; l++)        {            byte abyte0[] = ((SParser) (scriptplayer)).script;            int j1 = sobject.character.dataPos;            sparser.script = abyte0;            sparser.pos = j1;            if(sparser1 != null)            {                byte abyte1[] = ((SParser) (scriptplayer)).script;                sparser1.script = abyte1;                sparser1.pos = k;            }            do            {                int i1 = sparser.script[sparser.pos++] & 0xff;                if(i1 == 0)                    break;                int k1 = sparser.GetWord();//                int l1 = (sobject.ID & 0xffff) + sparser.GetWord();                Matrix matrix = sparser.GetMatrix();//                int i2 = k1 << 16 | l1;                if(k > 0)                {                    colortransform = new ColorTransform(flash);                    sparser1.GetColorTransform(colortransform);                }                boolean flag = (i1 & i) != 0;                boolean flag1 = (i1 & j) != 0;                if(l == 1 && flag && !flag1)                {                    SCharacter scharacter = scriptplayer.findCharacter(k1);                    if(scharacter != null) placeObject(scharacter,sobject.ID,k1,Matrix.concat(matrix, sobject.mat), colortransform);                } else                if(l == 0 && !flag && flag1)                    removeObject(sobject.ID,k1);            } while(true);            sobject.buttonState = i;        }    }    boolean setButtonState(SObject sobject, int i)    {        boolean flag = false;        if(sobject != button)        {            if(button != null)            {/*                button.character.player.PlayButtonSound(button, 1);*/                updateButton(button, 1);                flag = true;            }            button = sobject;            if(button != null)            {//                button.character.player.PlayButtonSound(button, i);                updateButton(button, i);                flag = true;            }        } else        if(button != null && button.buttonState != i)        {//            button.character.player.PlayButtonSound(button, i);            updateButton(button, i);            flag = true;        }        if(button != null)        {            buttonState = i;            buttonId = button.ID;        } else        {            buttonId = 0;        }        return flag;    }    SObject hitButton(int i, int j)    {        SObject sobject = null;        int k = 0;        for(SObject sobject1 = objects; sobject1 != null; sobject1 = sobject1.next)            if ((sobject1.character.type == 2) && (sobject1.ID>k) && (hitOneButton(sobject1, i, j)))            {                sobject = sobject1;                k = sobject1.ID;            }        return sobject;    }    boolean hitOneButton(SObject sobject, int i, int j)    {        Point point = new Point(i, j);        if(antialias)        {            point.x *= 4;            point.y *= 4;        }        ScriptPlayer scriptplayer = sobject.character.player;        SParser sparser = new SParser();        byte abyte0[] = ((SParser) (scriptplayer)).script;        int l = sobject.character.dataPos;        sparser.script = abyte0;        sparser.pos = l;        do        {            int k = sparser.script[sparser.pos++] & 0xff;            if(k != 0)

⌨️ 快捷键说明

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