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

📄 bitmap.java

📁 cygwin 是一个在windows平台上运行的unix模拟环境
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
			opcode = code >> 4;

			/* Handle different opcode forms */
			switch (opcode) {
			case 0xc:
			case 0xd:
			case 0xe:
				opcode -= 6;
				count = code & 0xf;
				offset = 16;
				break;

			case 0xf:
				opcode = code & 0xf;
				if (opcode < 9) {
					count = (compressed_pixel[input++] & 0xff);
					count |= ((compressed_pixel[input++] & 0xff) << 8);
				} else {
					count = (opcode < 0xb) ? 8 : 1;
				}
				offset = 0;
				break;

			default:
				opcode >>= 1;
				count = code & 0x1f;
				offset = 32;
				break;
			}

			/* Handle strange cases for counts */
			if (offset != 0) {
				isfillormix = ((opcode == 2) || (opcode == 7));

				if (count == 0) {
					if (isfillormix)
						count = (compressed_pixel[input++] & 0x000000ff) + 1;
					else
						count = (compressed_pixel[input++] & 0x000000ff)
								+ offset;
				} else if (isfillormix) {
					count <<= 3;
				}
			}

			switch (opcode) {
			case 0: /* Fill */
				if ((lastopcode == opcode)
						&& !((x == width) && (previous == 0)))
					insertmix = true;
				break;
			case 8: /* Bicolor */
				//color1 = cvalx(compressed_pixel, input, Bpp); // (compressed_pixel[input++]&0x000000ff);
                color1 = (compressed_pixel[input++]&0x000000ff);
                //input += Bpp;
			case 3: /* Color */
				// color2 = cvalx(compressed_pixel, input, Bpp); 
                color2 = (compressed_pixel[input++]&0x000000ff);
				// input += Bpp;
				break;
			case 6: /* SetMix/Mix */
			case 7: /* SetMix/FillOrMix */
				mix = compressed_pixel[input++];
				//mix = cvalx(compressed_pixel, input, Bpp);
				//input += Bpp;
				opcode -= 5;
				break;
			case 9: /* FillOrMix_1 */
				mask = 0x03;
				opcode = 0x02;
				fom_mask = 3;
				break;
			case 0x0a: /* FillOrMix_2 */
				mask = 0x05;
				opcode = 0x02;
				fom_mask = 5;
				break;

			}

			lastopcode = opcode;
			mixmask = 0;

			/* Output body */
			while (count > 0) {
				if (x >= width) {
					if (height <= 0)
						throw new RdesktopException("Decompressing bitmap failed! Height = " + height);

					x = 0;
					height--;

					previous = line;
					line = output + height * width;
				}

				switch (opcode) {
				case 0: /* Fill */
					if (insertmix) {
						if (previous == 0) {
							pixel[line+x] = (byte)mix;
						} else {
							//setli(pixel, line, x, 	getli(pixel, previous, x, Bpp) ^ mix, Bpp); 
                            pixel[line+x] = (byte)(pixel[previous+x] ^ (byte)mix);
						}

						insertmix = false;
						count--;
						x++;
					}

					if (previous == 0) {
						while (((count & ~0x7) != 0) && ((x + 8) < width)) {
							for (int i = 0; i < 8; i++) {
								//setli(pixel, line, x, 0, Bpp); 
                                pixel[line+x] = 0;
								count--;
								x++;
							}
						}
						while ((count > 0) && (x < width)) {
							//setli(pixel, line, x, 0, Bpp); 
                            pixel[line+x] = 0;
							count--;
							x++;
						}
					} else {
						while (((count & ~0x7) != 0) && ((x + 8) < width)) {
							for (int i = 0; i < 8; i++) {
								//setli(pixel, line, x, getli(pixel, previous, x, Bpp), Bpp);
								pixel[line+x] = pixel[previous+x];
								count--;
								x++;
							}
						}
						while ((count > 0) && (x < width)) {
							//setli(pixel, line, x, getli(pixel, previous, x, Bpp), Bpp);
							pixel[line+x] = pixel[previous+x];
							count--;
							x++;
						}
					}
					break;

				case 1: /* Mix */
					if (previous == 0) {
						while (((count & ~0x7) != 0) && ((x + 8) < width)) {
							for (int i = 0; i < 8; i++) {
								//setli(pixel, line, x, mix, Bpp);
								pixel[line+x] = (byte)mix;
								count--;
								x++;
							}
						}
						while ((count > 0) && (x < width)) {
							//setli(pixel, line, x, mix, Bpp);
							pixel[line+x] = (byte)mix;
							count--;
							x++;
						}
					} else {

						while (((count & ~0x7) != 0) && ((x + 8) < width)) {
							for (int i = 0; i < 8; i++) {
								setli(pixel, line, x, getli(pixel, previous, x, 1)	^ mix, 1);
								//setli(pixel, line, x, 0, Bpp);
								count--;
								x++;
							}
						}
						while ((count > 0) && (x < width)) {
							setli(pixel, line, x,getli(pixel, previous, x, 1) ^ mix, 1);
							// setli(pixel, line, x, 0, Bpp);
							count--;
							x++;
						}

					}
					break;
				case 2: /* Fill or Mix */
					if (previous == 0) {
						while (((count & ~0x7) != 0) && ((x + 8) < width)) {
							for (int i = 0; i < 8; i++) {
								mixmask <<= 1;
								if (mixmask == 0) {
									mask = (fom_mask != 0) ? (byte) fom_mask
											: compressed_pixel[input++];
									mixmask = 1;
								}
								if ((mask & mixmask) != 0)
								//	setli(pixel, line, x, mix, Bpp);
								 pixel[line+x] = (byte)mix;
								else
								//	setli(pixel, line, x, 0, Bpp);
								 pixel[line+x] = 0;
								count--;
								x++;
							}
						}
						while ((count > 0) && (x < width)) {
							mixmask <<= 1;
							if (mixmask == 0) {
								mask = (fom_mask != 0) ? (byte) fom_mask
										: compressed_pixel[input++];
								mixmask = 1;
							}
							if ((mask & mixmask) != 0)
								//setli(pixel, line, x, mix, Bpp);
							pixel[line+x] = (byte)mix;
							else
								//setli(pixel, line, x, 0, Bpp);
							pixel[line+x] = 0;
							count--;
							x++;
						}
					} else {
						while (((count & ~0x7) != 0) && ((x + 8) < width)) {
							for (int i = 0; i < 8; i++) {
								mixmask <<= 1;
								if (mixmask == 0) {
									mask = (fom_mask != 0) ? (byte) fom_mask
											: compressed_pixel[input++];
									mixmask = 1;
								}
								if ((mask & mixmask) != 0)
									//setli(pixel, line, x, getli(pixel,
									//		previous, x, Bpp)
									//		^ mix, Bpp);
								 pixel[line+x] = (byte)(pixel[previous+x] ^
								 (byte)mix);
								else
									//setli(pixel, line, x, getli(pixel,
									//		previous, x, Bpp), Bpp);
								pixel[line+x] = pixel[previous+x];
								count--;
								x++;
							}
						}
						while ((count > 0) && (x < width)) {
							mixmask <<= 1;
							if (mixmask == 0) {
								mask = (fom_mask != 0) ? (byte) fom_mask
										: compressed_pixel[input++];
								mixmask = 1;
							}
							if ((mask & mixmask) != 0)
								//setli(pixel, line, x, getli(pixel, previous, x,
								//	Bpp)
								//		^ mix, Bpp);
							pixel[line+x] = (byte)(pixel[previous+x] ^
							(byte)mix);
							else
							//	setli(pixel, line, x, getli(pixel, previous, x,
							//			Bpp), Bpp);
							pixel[line+x] = pixel[previous+x];
							count--;
							x++;
						}

					}
					break;

				case 3: /* Color */
					while (((count & ~0x7) != 0) && ((x + 8) < width)) {
						for (int i = 0; i < 8; i++) {
							//setli(pixel, line, x, color2, Bpp);
							pixel[line+x] = (byte)color2;
							count--;
							x++;
						}
					}
					while ((count > 0) && (x < width)) {
						//setli(pixel, line, x, color2, Bpp);
						pixel[line+x] = (byte)color2;
						count--;
						x++;
					}

					break;

				case 4: /* Copy */
					while (((count & ~0x7) != 0) && ((x + 8) < width)) {
						for (int i = 0; i < 8; i++) {
							//setli(pixel, line, x, cvalx(compressed_pixel,
							//		input, Bpp), Bpp);
							pixel[line+x] = compressed_pixel[input++];
							//input += Bpp;
							count--;
							x++;
						}
					}
					while ((count > 0) && (x < width)) {
						//setli(pixel, line, x, cvalx(compressed_pixel, input,
						//		Bpp), Bpp);
						//input += Bpp;
						pixel[line+x] = compressed_pixel[input++];
						count--;
						x++;
					}
					break;

				case 8: /* Bicolor */
					while (((count & ~0x7) != 0) && ((x + 8) < width)) {
						for (int i = 0; i < 8; i++) {
							if (bicolor) {
								//setli(pixel, line, x, color2, Bpp);
								pixel[line+x] = (byte)color2;
								bicolor = false;
							} else {
								//setli(pixel, line, x, color1, Bpp);
								pixel[line+x] = (byte)color1;
								bicolor = true;
								count++;
							}
							count--;
							x++;
						}
					}
					while ((count > 0) && (x < width)) {
						if (bicolor) {
							//setli(pixel, line, x, color2, Bpp);
							pixel[line+x] = (byte)color2;
							bicolor = false;
						} else {
							//setli(pixel, line, x, color1, Bpp);
							pixel[line+x] = (byte)color1;
							bicolor = true;
							count++;
						}
						count--;
						x++;
					}

					break;

				case 0xd: /* White */
					while (((count & ~0x7) != 0) && ((x + 8) < width)) {
						for (int i = 0; i < 8; i++) {
							//setli(pixel, line, x, 0xffffffff, Bpp);
							pixel[line+x] = (byte)0xff;
							count--;
							x++;
						}
					}
					while ((count > 0) && (x < width)) {
						//setli(pixel, line, x, 0xffffffff, Bpp);
						pixel[line+x] = (byte)0xff;
						count--;
						x++;
					}
					break;

				case 0xe: /* Black */
					while (((count & ~0x7) != 0) && ((x + 8) < width)) {
						for (int i = 0; i < 8; i++) {
							//setli(pixel, line, x, 0, Bpp);
							pixel[line+x] = (byte)0x00;
							count--;
							x++;
						}
					}
					while ((count > 0) && (x < width)) {
						//setli(pixel, line, x, 0, Bpp);
						pixel[line+x] = (byte)0x00;
						count--;
						x++;
					}

					break;
				default:
					throw new RdesktopException("Unimplemented decompress opcode " + opcode);// ;
				}
			}
		}

		bmpCount++;

		return pixel;
	}
}

⌨️ 快捷键说明

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