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

📄 bitmap.java

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

			/* 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 == -1)))
					insertmix = true;
				break;
			case 8: /* Bicolor */
				color1 = cvalx(compressed_pixel, input, Bpp);
					//(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 == -1) {
							pixel[line+x] = mix;
						} else {
							pixel[line+x] = (pixel[previous+x] ^ mix);
						}

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

					if (previous == -1) {
						while (((count & ~0x7) != 0) && ((x + 8) < width)) {
							for (int i = 0; i < 8; i++) {
								//setli(pixel, line, x, 0);
								pixel[line+x] = 0;
								count--;
								x++;
							}
						}
						while ((count > 0) && (x < width)) {
							//setli(pixel, line, x, 0);
							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, pixel[previous + x]);
								pixel[line + x] = pixel[previous + x];
								count--;
								x++;
							}
						}
						while ((count > 0) && (x < width)) {
							//setli(pixel, line, x, pixel[previous + x]);
							pixel[line + x] = pixel[previous + x];
							count--;
							x++;
						}
					}
					break;

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

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

					}
					break;
				case 2: /* Fill or Mix */
					if (previous == -1) {
						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] = 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] = (pixel[previous + x] ^ 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] = (pixel[previous + x] ^ 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] = color2;
							count--;
							x++;
						}
					}
					while ((count > 0) && (x < width)) {
						// setli(pixel, line, x, color2, Bpp);
						pixel[line + x] = 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++];
							pixel[line + x] = cvalx(compressed_pixel, input,
									Bpp);
							input += Bpp;
							count--;
							x++;
						}
					}
					while ((count > 0) && (x < width)) {
						// setli(pixel, line, x, cvalx(compressed_pixel,
						// input,Bpp), Bpp);
						pixel[line + x] = cvalx(compressed_pixel, input, 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] = color2;
								bicolor = false;
							} else {
								// setli(pixel, line, x, color1, Bpp);
								pixel[line + x] = color1;
								bicolor = true;
								count++;
							}
							count--;
							x++;
						}
					}
					while ((count > 0) && (x < width)) {
						if (bicolor) {
							// setli(pixel, line, x, color2, Bpp);
							pixel[line + x] = color2;
							bicolor = false;
						} else {
							// setli(pixel, line, x, color1, Bpp);
							pixel[line + x] = 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, 0xffffff, Bpp);
							pixel[line + x] = 0xffffff;
							count--;
							x++;
						}
					}
					while ((count > 0) && (x < width)) {
						// setli(pixel, line, x, 0xffffff, Bpp);
						pixel[line + x] = 0xffffff;
						count--;
						x++;
					}
					break;

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

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

       /* if(Options.server_bpp == 16){
            for(int i = 0; i < pixel.length; i++) pixel[i] = Bitmap.convert16to24(pixel[i]);
        }*/
        
		return pixel;
	}
    
    /**
     * Decompress bitmap data from packet and store in array of bytes
     * @param width Width of bitmap
     * @param height Height of bitmap
     * @param size Size of compressed data in bytes
     * @param data Packet containing bitmap data
     * @param Bpp Bytes per-pixel for bitmap
     * @return Byte array of pixels containing decompressed bitmap data
     * @throws RdesktopException
     */
	public static byte[] decompress(int width, int height, int size, RdpPacket_Localised data, int Bpp) throws RdesktopException {

		byte[] compressed_pixel = new byte[size];
		data.copyToByteArray(compressed_pixel, 0, data.getPosition(), size);
		data.incrementPosition(size);

		int previous = 0, line = 0;
		int input = 0, output = 0, end = size;
		int opcode = 0, count = 0, offset = 0, x = width;
		int lastopcode = -1, fom_mask = 0;
		int code = 0, color1 = 0, color2 = 0;
		byte mixmask = 0;
		int mask = 0;
		int mix = 0xffffffff;

		boolean insertmix = false, bicolor = false, isfillormix = false;

		byte[] pixel = new byte[width * height];
		while (input < end) {
			fom_mask = 0;
			code = (compressed_pixel[input++] & 0x000000ff);

⌨️ 快捷键说明

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