码迷,mamicode.com
首页 > 其他好文 > 详细

9.5位操作(八)——单色屏幕上画水平线

时间:2015-08-07 13:22:59      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:java   数据结构   算法   位操作   二进制   

/**
 * 功能:有个单色屏幕存储在一个一维字节数组中,使得8个连续像素可以存放在一个字节里。屏幕宽度位w,
 * 且w可以被8整除(即一个字节不会分布在两行上),屏幕高度可由数组长度和屏幕宽度推算得出。
 * 实现方法drawHorizontalLine(byte[] screen,int width,intx1,intx2,inty),绘制从点(x1,y)
 * 到点(x2,y)的水平线。
 */
	<pre name="code" class="java">	/**
	 * 思路:使用screen[byte_pos]=0xff,一次设定一整个字节。起点和终点剩余部分的位,使用掩码设定。
	 * @param screen
	 * @param width
	 * @param x1
	 * @param x2
	 * @param y
	 */
	public static void drawHorizontalLine(byte[] screen,int width,int x1,int x2,int y){
		int startOffset=x1%8;
		int firstFullByte=x1/8;
		if(startOffset!=0)
			firstFullByte++;
		
		int endOffset=x2%8;
		int lastFullByte=x2/8;
		if(endOffset!=7)
			lastFullByte--;
		
		//设定完整的字节
		for(int i=firstFullByte;i<=lastFullByte;i++){
			screen[(width/8)*y+i]=(byte)0xFF;
		}
		
		//创建用于线条起点和终点的掩码
		byte startMask=(byte) (1>>startOffset);
		byte endMask=(byte) ~(1>>(endOffset+1));
		
		//设定线条的起点和终点
		if((x1/8)==(x2/8)){
			byte mask=(byte) (startMask&endMask);
			screen[(width/8)*y+(x1/8)]|=mask;
		}else{
			if(startOffset!=0){
				int byteNumber=(width/8)*y+firstFullByte-1;
				screen[byteNumber]|=startMask;
			}
			if(endOffset!=0){
				int byteNumber=(width/8)*y+lastFullByte+1;
				screen[byteNumber]|=endMask;
			}
		}
	}



版权声明:本文为博主原创文章,未经博主允许不得转载。

9.5位操作(八)——单色屏幕上画水平线

标签:java   数据结构   算法   位操作   二进制   

原文地址:http://blog.csdn.net/shangqing1123/article/details/47337359

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!