PaletteViewer.java
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13: package xeij;
14:
15: import java.awt.*;
16: import java.awt.event.*;
17: import java.awt.font.*;
18: import java.awt.geom.*;
19: import java.awt.image.*;
20: import javax.swing.*;
21:
22: public class PaletteViewer {
23:
24: public static final boolean PLV_ON = true;
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81: static final int PLV_CELL_WIDTH = 18;
82: static final int PLV_CELL_HEIGHT = 18;
83:
84:
85:
86: static final int PLV_GROUP_GAP = 2;
87:
88:
89: static final String PLV_FONT_NAME = "Dialog";
90: static final int PLV_FONT_STYLE = Font.BOLD;
91: static final int PLV_FONT_SIZE = 16;
92: static final int PLV_HEADER_WIDTH = PLV_FONT_SIZE * 2;
93: static final int PLV_HEADER_HEIGHT = PLV_FONT_SIZE * 2;
94:
95:
96: static int plvImageWidth;
97: static int plvImageHeight;
98: static BufferedImage plvBufferedImage;
99: static int[] plvBitmap;
100: static ScrollCanvas plvCanvas;
101:
102:
103: static final int PLV_BACKGROUND_RGB = 0xff333333;
104: static final int PLV_FOREGROUND_RGB = 0xffcccccc;
105:
106:
107: static int plvCellOffset;
108: static int plvColsBit;
109: static int plvRowsBit;
110: static int plvColsMask;
111: static int plvRowsMask;
112: static int plvWidth;
113: static int plvHeight;
114:
115:
116:
117:
118: static final int PLV_DEF_ARRGT = 2;
119: static final int PLV_MIN_ARRGT = 0;
120: static final int PLV_MAX_ARRGT = 3;
121: static int plvArrgtNumber;
122: static JComboBox<String> plvArrgtComboBox;
123: static int plvArrgtLand;
124: static int plvArrgtPort;
125: static int plvArrgtCols;
126: static int plvArrgtRows;
127: static int plvArrgtWidth;
128: static int plvArrgtHeight;
129:
130:
131:
132:
133: static final int PLV_DEF_SCALE = 0;
134: static final int PLV_MIN_SCALE = -1;
135: static final int PLV_MAX_SCALE = 4;
136: static int plvScaleNumber;
137: static JComboBox<String> plvScaleComboBox;
138:
139:
140:
141:
142: static final boolean PLV_DEF_HEX = false;
143: static boolean plvHex;
144:
145:
146: static boolean plvStopped;
147: static boolean plvStoppedRequest;
148:
149: static final int[] plvCopiedPalTbl = new int[65536];
150: static final int[] plvCopiedPal16G8 = new int[256];
151: static final int[] plvCopiedPal16TS = new int[256];
152: static final int[] plvCopiedPal8G16L = new int[256];
153: static final int[] plvCopiedPal8G16H = new int[256];
154:
155: static int[] plvPalTbl;
156: static int[] plvPal16G8;
157: static int[] plvPal16TS;
158: static int[] plvPal8G16L;
159: static int[] plvPal8G16H;
160:
161: static boolean plvG65536On;
162:
163:
164: static JTextField plvTextField;
165: static boolean plvTextLocked;
166:
167:
168: static JFrame plvFrame;
169:
170:
171: static JPopupMenu plvPopupMenu;
172: static int plvPageToCopy;
173: static int plvRowToCopy;
174:
175:
176: public static final int PLV_INTERVAL = 10;
177: public static int plvTimer;
178:
179:
180:
181: public static void plvInit () {
182:
183: plvArrgtNumber = Settings.sgsGetInt ("plvarrgt", PLV_DEF_ARRGT, PLV_MIN_ARRGT, PLV_MAX_ARRGT);
184: plvHex = Settings.sgsGetOnOff ("plvhex", PLV_DEF_HEX);
185: plvScaleNumber = Settings.sgsGetInt ("plvscale", PLV_DEF_SCALE, PLV_MIN_SCALE, PLV_MAX_SCALE);
186:
187: plvCellOffset = 0;
188: plvColsBit =
189: plvRowsBit = 4;
190: plvColsMask = (1 << plvColsBit) - 1;
191: plvRowsMask = (1 << plvRowsBit) - 1;
192: plvWidth = (PLV_HEADER_WIDTH +
193: (PLV_CELL_WIDTH << plvColsBit) +
194: (PLV_GROUP_GAP << (plvColsBit - 2)) - PLV_GROUP_GAP);
195: plvHeight = (PLV_HEADER_HEIGHT +
196: (PLV_CELL_HEIGHT << plvRowsBit) +
197: (PLV_GROUP_GAP << (plvRowsBit - 2)) - PLV_GROUP_GAP);
198:
199: plvImageWidth = plvWidth * 2;
200: plvImageHeight = plvHeight * 2;
201:
202: plvSetArrgt (plvArrgtNumber);
203:
204: plvSetStoppedOff ();
205:
206: plvFrame = null;
207:
208: plvTimer = 0;
209: }
210:
211:
212:
213: public static void plvTini () {
214:
215: Settings.sgsPutInt ("plvarrgt", plvArrgtNumber);
216: Settings.sgsPutOnOff ("plvhex", plvHex);
217: Settings.sgsPutInt ("plvscale", plvScaleNumber);
218: }
219:
220:
221:
222: static void plvSetArrgt (int number) {
223: plvArrgtNumber = number;
224: plvArrgtLand = plvArrgtNumber == 2 ? 2 : 1;
225: plvArrgtPort = plvArrgtNumber == 3 ? 2 : 1;
226: plvArrgtCols = plvArrgtLand << plvColsBit;
227: plvArrgtRows = plvArrgtPort << plvRowsBit;
228: plvArrgtWidth = plvWidth * plvArrgtLand;
229: plvArrgtHeight = plvHeight * plvArrgtPort;
230: if (plvCanvas != null) {
231: plvDrawHeader ();
232: plvCanvas.setImage (plvArrgtWidth, plvArrgtHeight);
233: }
234: }
235:
236:
237:
238: static int plvColToX (int col) {
239: int p = col >> plvColsBit;
240: col &= plvColsMask;
241: int g = col >> 2;
242: col &= 3;
243: return (plvWidth * p +
244: PLV_HEADER_WIDTH +
245: ((PLV_CELL_WIDTH << 2) + PLV_GROUP_GAP) * g +
246: PLV_CELL_WIDTH * col);
247: }
248:
249:
250:
251: static int plvRowToY (int row) {
252: int p = row >> plvRowsBit;
253: row &= plvRowsMask;
254: int g = row >> 2;
255: row &= 3;
256: return (plvHeight * p +
257: PLV_HEADER_HEIGHT +
258: ((PLV_CELL_HEIGHT << 2) + PLV_GROUP_GAP) * g +
259: PLV_CELL_HEIGHT * row);
260: }
261:
262:
263:
264: static int plvXToXCol (int x) {
265: if (x < 0 || plvArrgtWidth <= x) {
266: return -1;
267: }
268: int p = x / plvWidth;
269: x -= plvWidth * p;
270: if (x < PLV_HEADER_WIDTH) {
271: return -1;
272: }
273: x -= PLV_HEADER_WIDTH;
274: int g = x / ((PLV_CELL_WIDTH << 2) + PLV_GROUP_GAP);
275: x -= ((PLV_CELL_WIDTH << 2) + PLV_GROUP_GAP) * g;
276: if ((PLV_CELL_WIDTH << 2) <= x) {
277: return -1;
278: }
279: int col = x / PLV_CELL_WIDTH;
280: x -= PLV_CELL_WIDTH * col;
281: return (x << 16) | ((p << plvColsBit) + (g << 2) + col);
282: }
283:
284:
285:
286: static int plvYToYRow (int y) {
287: if (y < 0 || plvArrgtHeight <= y) {
288: return -1;
289: }
290: int p = y / plvHeight;
291: y -= plvHeight * p;
292: if (y < PLV_HEADER_HEIGHT) {
293: return -1;
294: }
295: y -= PLV_HEADER_HEIGHT;
296: int g = y / ((PLV_CELL_HEIGHT << 2) + PLV_GROUP_GAP);
297: y -= ((PLV_CELL_HEIGHT << 2) + PLV_GROUP_GAP) * g;
298: if ((PLV_CELL_HEIGHT << 2) <= y) {
299: return -1;
300: }
301: int row = y / PLV_CELL_HEIGHT;
302: y -= PLV_CELL_HEIGHT * row;
303: return (y << 16) | ((p << plvRowsBit) + (g << 2) + row);
304: }
305:
306:
307:
308: public static void plvStart () {
309: if (RestorableFrame.rfmGetOpened (Settings.SGS_PLV_FRAME_KEY)) {
310: plvOpen ();
311: }
312: }
313:
314:
315:
316: public static void plvOpen () {
317: if (plvFrame == null) {
318: plvMakeFrame ();
319: } else {
320: plvUpdateFrame ();
321: }
322: XEiJ.dbgVisibleMask |= XEiJ.DBG_PLV_VISIBLE_MASK;
323: XEiJ.pnlExitFullScreen (false);
324: plvFrame.setVisible (true);
325: }
326:
327:
328:
329:
330: static void plvMakeFrame () {
331:
332: plvBufferedImage = new BufferedImage (plvImageWidth, plvImageHeight, BufferedImage.TYPE_INT_ARGB);
333: plvDrawHeader ();
334:
335: plvBitmap = ((DataBufferInt) plvBufferedImage.getRaster ().getDataBuffer ()).getData ();
336:
337: plvCanvas = new ScrollCanvas (plvBufferedImage, plvArrgtWidth, plvArrgtHeight);
338: plvCanvas.setMatColor (new Color (PLV_BACKGROUND_RGB));
339: plvCanvas.setMinScaleShift (PLV_MIN_SCALE);
340: plvCanvas.setMaxScaleShift (PLV_MAX_SCALE);
341: plvCanvas.setScaleShift (plvScaleNumber);
342:
343: ActionListener listener = new ActionListener () {
344: @Override public void actionPerformed (ActionEvent ae) {
345: Object source = ae.getSource ();
346: String command = ae.getActionCommand ();
347: switch (command) {
348: case "Arrgt":
349: plvSetArrgt (plvArrgtComboBox.getSelectedIndex () + PLV_MIN_ARRGT);
350: if (XEiJ.mpuTask == null) {
351: plvUpdateFrame ();
352: }
353: break;
354: case "Scale":
355: plvScaleNumber = plvScaleComboBox.getSelectedIndex () + PLV_MIN_SCALE;
356: plvCanvas.setScaleShift (plvScaleNumber);
357: break;
358: case "Hex":
359: plvHex = (((JCheckBox) source).isSelected ());
360: plvDrawHeader ();
361: plvUpdateFrame ();
362: break;
363: case "Stop":
364: plvStoppedRequest = (((JCheckBox) source).isSelected ());
365: if (XEiJ.mpuTask == null) {
366: plvUpdateFrame ();
367: }
368: break;
369: case "Copy as hexadecimal":
370: if (0 <= plvPageToCopy) {
371: StringBuilder sb = new StringBuilder ();
372: for (int col = 0; col <= plvColsMask; col++) {
373: if (col != 0) {
374: sb.append (' ');
375: }
376: int p = col + (plvRowToCopy << plvColsBit);
377: int c = (plvPageToCopy == 0 ? plvPal16G8 : plvPal16TS)[p];
378: sb.append (String.format ("%04X", c));
379: }
380: XEiJ.clpCopy (sb.toString ());
381: plvPageToCopy = -1;
382: }
383: break;
384: default:
385: System.out.println ("unknown action command " + command);
386: }
387: }
388: };
389:
390: plvTextField = new JTextField ();
391: plvTextField.setEditable (false);
392: plvTextField.setHorizontalAlignment (JTextField.CENTER);
393:
394: plvFrame = Multilingual.mlnTitle (
395: ComponentFactory.createRestorableSubFrame (
396: Settings.SGS_PLV_FRAME_KEY,
397: "Palette Viewer",
398: null,
399: ComponentFactory.createBorderPanel (
400: 0, 0,
401:
402: plvCanvas,
403:
404: ComponentFactory.createVerticalBox (
405:
406: ComponentFactory.createHorizontalBox (
407: Box.createHorizontalGlue (),
408:
409: Multilingual.mlnText (
410: ComponentFactory.createLabel ("Arrgt"),
411: "ja", "配置"),
412: plvArrgtComboBox = ComponentFactory.createComboBox (
413: plvArrgtNumber - PLV_MIN_ARRGT,
414: "Arrgt",
415: listener,
416: "G", "TS", "H", "V"),
417:
418: Multilingual.mlnText (
419: ComponentFactory.createLabel ("Scale"),
420: "ja", "倍率"),
421: plvScaleComboBox = ComponentFactory.createComboBox (
422: plvScaleNumber - PLV_MIN_SCALE,
423: "Scale",
424: listener,
425: "1/2", "1", "2", "4", "8", "16"),
426:
427: Box.createHorizontalStrut (5),
428: ComponentFactory.createCheckBox (plvHex, "Hex", listener),
429:
430: Box.createHorizontalGlue ()
431: ),
432:
433: ComponentFactory.createHorizontalBox (
434: Box.createHorizontalGlue (),
435:
436: plvTextField,
437:
438: Box.createHorizontalStrut (5),
439: Multilingual.mlnText (
440: ComponentFactory.createCheckBox (plvStoppedRequest, "Stop", listener),
441: "ja", "停止"),
442:
443: Box.createHorizontalGlue ()
444: )
445: )
446: )
447: ),
448: "ja", "パレットビュア");
449:
450: plvCanvas.addScaleShiftListener (new ScrollCanvas.ScaleShiftListener () {
451: @Override public void scaleShiftChanged (int scaleShift) {
452: plvScaleNumber = scaleShift;
453: plvScaleComboBox.setSelectedIndex (plvScaleNumber - PLV_MIN_SCALE);
454: }
455: });
456:
457: ComponentFactory.addListener (
458: plvFrame,
459: new WindowAdapter () {
460: @Override public void windowClosing (WindowEvent we) {
461: XEiJ.dbgVisibleMask &= ~XEiJ.DBG_PLV_VISIBLE_MASK;
462: }
463: });
464:
465: plvPopupMenu = ComponentFactory.createPopupMenu (
466: Multilingual.mlnText (
467: ComponentFactory.createMenuItem ("Copy as hexadecimal", 'C', listener),
468: "ja", "16進数でコピー")
469: );
470: plvPageToCopy = -1;
471:
472: MouseAdapter ma = new MouseAdapter () {
473: @Override public void mouseClicked (MouseEvent me) {
474: plvTextLocked = !plvTextLocked;
475: }
476: @Override public void mouseMoved (MouseEvent me) {
477: if (!plvTextLocked) {
478: MouseEvent2D me2D = (MouseEvent2D) me;
479: int x = (int) me2D.getX2D ();
480: int y = (int) me2D.getY2D ();
481: String s = plvGetPixel (x, y);
482: plvTextField.setText (s == null ? "" : s);
483: }
484: }
485: @Override public void mousePressed (MouseEvent me) {
486: plvShowPopup (me);
487: }
488: @Override public void mouseReleased (MouseEvent me) {
489: plvShowPopup (me);
490: }
491: };
492: plvCanvas.addMouseListener (ma);
493: plvCanvas.addMouseMotionListener (ma);
494: }
495:
496:
497:
498: static void plvShowPopup (MouseEvent me) {
499: if (!me.isPopupTrigger ()) {
500: return;
501: }
502: MouseEvent2D me2D = (MouseEvent2D) me;
503: int x = (int) me2D.getX2D ();
504: int y = (int) me2D.getY2D ();
505: int col = plvXToXCol (x);
506: int row = plvYToYRow (y);
507: if (col < 0 || row < 0) {
508: return;
509: }
510: col = (char) col;
511: row = (char) row;
512: if (col <= plvColsMask && row <= plvRowsMask && plvArrgtNumber != 1) {
513: plvPageToCopy = 0;
514: } else {
515: plvPageToCopy = 1;
516: }
517: plvRowToCopy = row & plvRowsMask;
518: Point p = plvCanvas.getPopupPoint (me2D);
519: plvPopupMenu.show (plvCanvas, p.x, p.y);
520: }
521:
522:
523:
524: static void plvDrawHeader () {
525: Graphics2D g2 = plvBufferedImage.createGraphics ();
526:
527: g2.setColor (new Color (PLV_BACKGROUND_RGB));
528: g2.fillRect (0, 0, plvArrgtWidth, plvArrgtHeight);
529:
530: g2.setColor (new Color (PLV_FOREGROUND_RGB));
531: g2.setFont (new Font (PLV_FONT_NAME, PLV_FONT_STYLE, PLV_FONT_SIZE));
532:
533: if (plvArrgtNumber != 1) {
534: plvDrawString (g2,
535: (PLV_HEADER_WIDTH + plvWidth) / 2,
536: plvRowToY (0) - PLV_FONT_SIZE * 13 / 12,
537: "Graphic Palette",
538: SwingConstants.SOUTH);
539: }
540: if (plvArrgtNumber != 0) {
541: plvDrawString (g2,
542: plvArrgtWidth - plvWidth + (PLV_HEADER_WIDTH + plvWidth) / 2,
543: plvArrgtHeight - plvHeight + plvRowToY (0) - PLV_FONT_SIZE * 13 / 12,
544: "Text and Sprite Palette",
545: SwingConstants.SOUTH);
546: }
547:
548: for (int row = 0; row < plvArrgtRows; row += (plvRowsMask + 1)) {
549: for (int col = 0; col < plvArrgtCols; col++) {
550: plvDrawString (g2,
551: plvColToX (col) + PLV_CELL_WIDTH / 2,
552: plvRowToY (row) - PLV_FONT_SIZE / 12,
553: String.format (plvHex ? "%X" : "%d", col & plvColsMask),
554: SwingConstants.SOUTH);
555: }
556: }
557:
558: for (int col = 0; col < plvArrgtCols; col += (plvColsMask + 1)) {
559: for (int row = 0; row < plvArrgtRows; row++) {
560: plvDrawString (g2,
561: plvColToX (col) - PLV_FONT_SIZE / 6,
562: plvRowToY (row) + PLV_CELL_HEIGHT / 2,
563: String.format (plvHex ? "%X" : "%d",
564: plvCellOffset + ((row & plvRowsMask) << plvColsBit)),
565: SwingConstants.EAST);
566: }
567: }
568: }
569:
570:
571:
572: static void plvDrawString (Graphics2D g2, int x, int y, String s, int d) {
573: Font f = g2.getFont ();
574: FontRenderContext flc = g2.getFontRenderContext ();
575: TextLayout tl = new TextLayout (s, f, flc);
576: Rectangle2D r = tl.getBounds ();
577: int rx = (int) Math.round (r.getX ());
578: int ry = (int) Math.round (r.getY ());
579: int rw = (int) Math.round (r.getWidth ());
580: int rh = (int) Math.round (r.getHeight ());
581: switch (d) {
582: case SwingConstants.NORTH_WEST:
583: g2.drawString (s, x - rx, y - ry);
584: break;
585: case SwingConstants.NORTH:
586: g2.drawString (s, x - (rx + (rw >> 1)), y - ry);
587: break;
588: case SwingConstants.NORTH_EAST:
589: g2.drawString (s, x - (rx + rw), y - ry);
590: break;
591: case SwingConstants.WEST:
592: g2.drawString (s, x - rx, y - (ry + (rh >> 1)));
593: break;
594: case SwingConstants.CENTER:
595: g2.drawString (s, x - (rx + (rw >> 1)), y - (ry + (rh >> 1)));
596: break;
597: case SwingConstants.EAST:
598: g2.drawString (s, x - (rx + rw), y - (ry + (rh >> 1)));
599: break;
600: case SwingConstants.SOUTH_WEST:
601: g2.drawString (s, x - rx, y - (ry + rh));
602: break;
603: case SwingConstants.SOUTH:
604: g2.drawString (s, x - (rx + (rw >> 1)), y - (ry + rh));
605: break;
606: case SwingConstants.SOUTH_EAST:
607: g2.drawString (s, x - (rx + rw), y - (ry + rh));
608: break;
609: }
610: }
611:
612:
613:
614: static String plvGetPixel (int x, int y) {
615: int col = plvXToXCol (x);
616: int row = plvYToYRow (y);
617: if (col < 0 || row < 0) {
618: return null;
619: }
620: x = col >> 16;
621: y = row >> 16;
622: col = (char) col;
623: row = (char) row;
624: int p = (col & plvColsMask) + ((row & plvRowsMask) << plvColsBit);
625: if (col <= plvColsMask && row <= plvRowsMask && plvArrgtNumber != 1) {
626: if (plvG65536On) {
627: if (x == 0 || x == PLV_CELL_WIDTH - 1 ||
628: y == 0 || y == PLV_CELL_HEIGHT - 1 ||
629: x == PLV_CELL_WIDTH / 2 - 1 ||
630: x == PLV_CELL_WIDTH / 2) {
631: return null;
632: }
633: int h = x < PLV_CELL_WIDTH / 2 ? 0 : 1;
634: if ((p & 1) == 0) {
635: p += h;
636: int c = plvPal8G16L[p];
637: return String.format ("G p=0x??%02X c=0x??%02X(%d,%d,%d,%d)",
638: p, c,
639: c >> 11, (c >> 6) & 31, (c >> 1) & 31, c & 1);
640: } else {
641: p = (p & -2) + h;
642: int c = plvPal8G16H[p];
643: return String.format ("G p=0x%02X?? c=0x%02X??(%d,%d,%d,%d)",
644: p, c >> 8,
645: c >> 11, (c >> 6) & 31, (c >> 1) & 31, c & 1);
646: }
647: } else {
648: if (x == 0 || x == PLV_CELL_WIDTH - 1 ||
649: y == 0 || y == PLV_CELL_HEIGHT - 1) {
650: return null;
651: }
652: int c = plvPal16G8[p];
653: return String.format ("G p=0x%02X c=0x%04X(%d,%d,%d,%d)",
654: p, c,
655: c >> 11, (c >> 6) & 31, (c >> 1) & 31, c & 1);
656: }
657: } else {
658: if (x == 0 || x == PLV_CELL_WIDTH - 1 ||
659: y == 0 || y == PLV_CELL_HEIGHT - 1) {
660: return null;
661: }
662: int c = plvPal16TS[p];
663: return String.format ("TS p=0x%02X c=0x%04X(%d,%d,%d,%d)",
664: p, c,
665: c >> 11, (c >> 6) & 31, (c >> 1) & 31, c & 1);
666: }
667: }
668:
669:
670:
671: static void plvUpdateFrame () {
672: if (plvFrame == null) {
673: return;
674: }
675:
676: if (plvStopped != plvStoppedRequest) {
677: if (plvStoppedRequest) {
678: plvSetStoppedOn ();
679: } else {
680: plvSetStoppedOff ();
681: }
682: }
683: if (!plvStopped) {
684: plvG65536On = ((VideoController.vcnReg1Port & 2) != 0 &&
685: (VideoController.vcnReg3Port & 15) != 0);
686: }
687:
688: for (int row = 0; row < plvArrgtRows; row++) {
689: int y = plvRowToY (row) + 1;
690: for (int col = 0; col < plvArrgtCols; col++) {
691: int x = plvColToX (col) + 1;
692: int i = x + plvImageWidth * y;
693: int p = (col & plvColsMask) + ((row & plvRowsMask) << plvColsBit);
694: if (col <= plvColsMask && row <= plvRowsMask && plvArrgtNumber != 1) {
695: if (plvG65536On) {
696: for (int v = 0; v < PLV_CELL_HEIGHT - 2; v++) {
697: plvBitmap[i + PLV_CELL_WIDTH / 2 - 2] = PLV_BACKGROUND_RGB;
698: plvBitmap[i + PLV_CELL_WIDTH / 2 - 1] = PLV_BACKGROUND_RGB;
699: i += plvImageWidth;
700: }
701: i += -plvImageWidth * (PLV_CELL_HEIGHT - 2);
702: for (int h = 0; h < 2; h++) {
703: int c = ((p & 1) == 0 ? plvPal8G16L : plvPal8G16H)[(p & -2) + h];
704: int d = plvPalTbl[c];
705: for (int v = 0; v < PLV_CELL_HEIGHT - 2; v++) {
706: for (int u = 0; u < PLV_CELL_WIDTH / 2 - 2; u++) {
707: plvBitmap[i + u] = d;
708: }
709: i += plvImageWidth;
710: }
711: i += PLV_CELL_WIDTH / 2 - plvImageWidth * (PLV_CELL_HEIGHT - 2);
712: }
713: } else {
714: int c = plvPal16G8[p];
715: int d = plvPalTbl[c];
716: for (int v = 0; v < PLV_CELL_HEIGHT - 2; v++) {
717: for (int u = 0; u < PLV_CELL_WIDTH - 2; u++) {
718: plvBitmap[i + u] = d;
719: }
720: i += plvImageWidth;
721: }
722: }
723: } else {
724: int c = plvPal16TS[p];
725: int d = plvPalTbl[c];
726: for (int v = 0; v < PLV_CELL_HEIGHT - 2; v++) {
727: for (int u = 0; u < PLV_CELL_WIDTH - 2; u++) {
728: plvBitmap[i + u] = d;
729: }
730: i += plvImageWidth;
731: }
732: }
733: }
734: }
735: plvCanvas.repaint ();
736: }
737:
738:
739:
740: static void plvSetStoppedOn () {
741: plvStopped = true;
742: plvStoppedRequest = true;
743:
744: System.arraycopy (VideoController.vcnPalBase[VideoController.VCN_CONTRAST_SCALE * 15], 0, plvCopiedPalTbl, 0, 65536);
745: System.arraycopy (VideoController.vcnPal16G8, 0, plvCopiedPal16G8, 0, 256);
746: System.arraycopy (VideoController.vcnPal16TSPort, 0, plvCopiedPal16TS, 0, 256);
747: System.arraycopy (VideoController.vcnPal8G16L, 0, plvCopiedPal8G16L, 0, 256);
748: System.arraycopy (VideoController.vcnPal8G16H, 0, plvCopiedPal8G16H, 0, 256);
749:
750: plvPalTbl = plvCopiedPalTbl;
751: plvPal16G8 = plvCopiedPal16G8;
752: plvPal16TS = plvCopiedPal16TS;
753: plvPal8G16L = plvCopiedPal8G16L;
754: plvPal8G16H = plvCopiedPal8G16H;
755: }
756:
757:
758:
759: static void plvSetStoppedOff () {
760: plvStopped = false;
761:
762: plvPalTbl = VideoController.vcnPalBase[VideoController.VCN_CONTRAST_SCALE * 15];
763: plvPal16G8 = VideoController.vcnPal16G8;
764: plvPal16TS = VideoController.vcnPal16TSPort;
765: plvPal8G16L = VideoController.vcnPal8G16L;
766: plvPal8G16H = VideoController.vcnPal8G16H;
767: }
768:
769: }