private void sendBiColor(int first, DisplayMessage m, int height,
			int width, BitmapLine firstLine) {

		// On envoi en bi
		// System.out.println("BI: " + toX + " , " + (toY + first) + " " + width
		// + " x " + height);
		if (width > 32) {
			for (int i = 0; i < height; i++) {
				sendBiColorLine(pixels, width, i + first, toX, toY, firstLine
						.getColor0(), firstLine.getColor1(), m);
			}
			return;
		}

		// Compute Widths
		int nbColor = width;
		int MAX = (1448 - 64);
		int nbSegmentW = (int) Math.ceil((double) nbColor / MAX);

		int limitedWidth = (int) Math.ceil((double) width / nbSegmentW);
		if (limitedWidth > width) {
			limitedWidth = width;
		} else if (limitedWidth < 1) {
			limitedWidth = 1;
		}
		// System.out.println("width:" + width + " nbSegm:" + nbSegmentW
		// + " limit width to:" + limitedWidth + " MAX:" + MAX);

		int[] widths = Util.split(width, limitedWidth);

		// Compute Heights
		nbColor = limitedWidth * height;
		int nbSegmentH = (int) Math.ceil((double) nbColor / MAX);
		int limitedHeight = (int) Math.floor((double) height / nbSegmentH);
		if (limitedHeight < 1) {
			limitedHeight = 1;
		} else if (limitedHeight > height) {
			limitedHeight = height;
		}
		int[] heights = Util.split(height, limitedHeight);

		// System.out.println("height:" + height + " nbSegm:" + nbSegmentH
		// + " limit height to:" + limitedHeight + " MAX:" + MAX);
		for (int j = 0; j < heights.length; j++) {
			int newHeight = heights[j];

			for (int i = 0; i < widths.length; i++) {
				int newWidth = widths[i];
				BitArray bytes = BitmapOperation.getBytes(pixels, width,
						limitedWidth * i, first + limitedHeight * j, newWidth,
						newHeight, firstLine.getColor1());
				m.addOperation(new BitmapOperation(toX + limitedWidth * i, toY
						+ first + limitedHeight * j, newWidth, newHeight,
						new Color(firstLine.getColor0()), new Color(firstLine
								.getColor1()), bytes));
			}
		}
	}