📄 displaylist.java
字号:
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 + -