Squiz Matrix  4.12.2
 All Data Structures Namespaces Functions Variables Pages
ByteBlitter.java
1 package ij.process;
2 import java.awt.*;
3 
5 public class ByteBlitter implements Blitter {
6 
7  private ByteProcessor ip;
8  private int width, height;
9  private byte[] pixels;
10  private int transparent = 255;
11 
14  this.ip = ip;
15  width = ip.getWidth();
16  height = ip.getHeight();
17  pixels = (byte[])ip.getPixels();
18  }
19 
20  public void setTransparentColor(Color c) {
21  transparent = ip.getBestIndex(c);
22  //ij.IJ.write(c+" "+transparent);
23  }
24 
26  public void copyBits(ImageProcessor ip, int xloc, int yloc, int mode) {
27  Rectangle r1, r2;
28  int srcIndex, dstIndex;
29  int xSrcBase, ySrcBase;
30  byte[] srcPixels;
31 
32  int srcWidth = ip.getWidth();
33  int srcHeight = ip.getHeight();
34  r1 = new Rectangle(srcWidth, srcHeight);
35  r1.setLocation(xloc, yloc);
36  r2 = new Rectangle(width, height);
37  if (!r1.intersects(r2))
38  return;
39  if (ip instanceof ColorProcessor) {
40  int[] pixels32 = (int[])ip.getPixels();
41  int size = ip.getWidth()*ip.getHeight();
42  srcPixels = new byte[size];
43  if (this.ip.isInvertedLut())
44  for (int i=0; i<size; i++)
45  srcPixels[i] = (byte)(255-pixels32[i]&255);
46  else
47  for (int i=0; i<size; i++)
48  srcPixels[i] = (byte)(pixels32[i]&255);
49  } else
50  srcPixels = (byte [])ip.getPixels();
51  r1 = r1.intersection(r2);
52  xSrcBase = (xloc<0)?-xloc:0;
53  ySrcBase = (yloc<0)?-yloc:0;
54  int src, dst;
55  for (int y=r1.y; y<(r1.y+r1.height); y++) {
56  srcIndex = (y-yloc)*srcWidth + (r1.x-xloc);
57  dstIndex = y * width + r1.x;
58  switch (mode) {
59  case COPY:
60  for (int i=r1.width; --i>=0;)
61  pixels[dstIndex++] = srcPixels[srcIndex++];
62  break;
63  case COPY_INVERTED:
64  for (int i=r1.width; --i>=0;)
65  pixels[dstIndex++] = (byte)(255-srcPixels[srcIndex++]&255);
66  break;
67  case COPY_TRANSPARENT:
68  for (int i=r1.width; --i>=0;) {
69  src = srcPixels[srcIndex++]&255;
70  if (src==transparent)
71  dst = pixels[dstIndex];
72  else
73  dst = src;
74  pixels[dstIndex++] = (byte)dst;
75  }
76  break;
77  case ADD:
78  for (int i=r1.width; --i>=0;) {
79  dst = (srcPixels[srcIndex++]&255)+(pixels[dstIndex]&255);
80  if (dst>255) dst = 255;
81  pixels[dstIndex++] = (byte)dst;
82  }
83  break;
84  case AVERAGE:
85  for (int i=r1.width; --i>=0;) {
86  dst = ((srcPixels[srcIndex++]&255)+(pixels[dstIndex]&255))/2;
87  pixels[dstIndex++] = (byte)dst;
88  }
89  break;
90  case SUBTRACT:
91  for (int i=r1.width; --i>=0;) {
92  dst = (pixels[dstIndex]&255)-(srcPixels[srcIndex++]&255);
93  if (dst<0) dst = 0;
94  pixels[dstIndex++] = (byte)dst;
95  }
96  break;
97  case DIFFERENCE:
98  for (int i=r1.width; --i>=0;) {
99  dst = (pixels[dstIndex]&255)-(srcPixels[srcIndex++]&255);
100  if (dst<0) dst = -dst;
101  pixels[dstIndex++] = (byte)dst;
102  }
103  break;
104  case MULTIPLY:
105  for (int i=r1.width; --i>=0;) {
106  dst = (srcPixels[srcIndex++]&255)*(pixels[dstIndex]&255);
107  if (dst>255) dst = 255;
108  pixels[dstIndex++] = (byte)dst;
109  }
110  break;
111  case DIVIDE:
112  for (int i=r1.width; --i>=0;) {
113  src = srcPixels[srcIndex++]&255;
114  if (src==0)
115  dst = 255;
116  else
117  dst = (pixels[dstIndex]&255)/src;
118  pixels[dstIndex++] = (byte)dst;
119  }
120  break;
121  case AND:
122  for (int i=r1.width; --i>=0;) {
123  dst = srcPixels[srcIndex++]&pixels[dstIndex];
124  pixels[dstIndex++] = (byte)dst;
125  }
126  break;
127  case OR:
128  for (int i=r1.width; --i>=0;) {
129  dst = srcPixels[srcIndex++]|pixels[dstIndex];
130  pixels[dstIndex++] = (byte)dst;
131  }
132  break;
133  case XOR:
134  for (int i=r1.width; --i>=0;) {
135  dst = srcPixels[srcIndex++]^pixels[dstIndex];
136  pixels[dstIndex++] = (byte)dst;
137  }
138  break;
139  case MIN:
140  for (int i=r1.width; --i>=0;) {
141  src = srcPixels[srcIndex++]&255;
142  dst = pixels[dstIndex]&255;
143  if (src<dst) dst = src;
144  pixels[dstIndex++] = (byte)dst;
145  }
146  break;
147  case MAX:
148  for (int i=r1.width; --i>=0;) {
149  src = srcPixels[srcIndex++]&255;
150  dst = pixels[dstIndex]&255;
151  if (src>dst) dst = src;
152  pixels[dstIndex++] = (byte)dst;
153  }
154  break;
155  }
156  if (y%20==0)
157  ip.showProgress((double)(y-r1.y)/r1.height);
158  }
159  ip.hideProgress();
160  }
161 }