/** * Copyright (c) 2010 Michael A. MacDonald */ package android.androidVNC; import java.io.IOException; import java.util.Arrays; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.util.Log; import android.widget.ImageView; /** * @author Michael A. MacDonald * */ class FullBufferBitmapData extends AbstractBitmapData { int xoffset; int yoffset; /** * @author Michael A. MacDonald * */ class Drawable extends AbstractBitmapDrawable { /** * @param data */ public Drawable(AbstractBitmapData data) { super(data); // TODO Auto-generated constructor stub } /* (non-Javadoc) * @see android.graphics.drawable.DrawableContainer#draw(android.graphics.Canvas) */ @Override public void draw(Canvas canvas) { if (vncCanvas.getScaleType() == ImageView.ScaleType.FIT_CENTER) { canvas.drawBitmap(data.bitmapPixels, 0, data.framebufferwidth, xoffset, yoffset, framebufferwidth, framebufferheight, false, null); } else { float scale = vncCanvas.getScale(); int xo = xoffset < 0 ? 0 : xoffset; int yo = yoffset < 0 ? 0 : yoffset; /* if (scale == 1 || scale <= 0) { */ int drawWidth = vncCanvas.getVisibleWidth(); if (drawWidth + xo > data.framebufferwidth) drawWidth = data.framebufferwidth - xo; int drawHeight = vncCanvas.getVisibleHeight(); if (drawHeight + yo > data.framebufferheight) drawHeight = data.framebufferheight - yo; // int tempXo = xo; if (VncCanvasActivity.isLinux) tempXo = xo - VncCanvasActivity.deltaX; canvas.drawBitmap(data.bitmapPixels, offset(xo, yo), data.framebufferwidth, tempXo, yo, drawWidth, drawHeight, false, null); //canvas.drawBitmap(colors, offset, stride, x, y, width, height, hasAlpha, paint) /* } else { int scalewidth = (int)(vncCanvas.getVisibleWidth() / scale + 1); if (scalewidth + xo > data.framebufferwidth) scalewidth = data.framebufferwidth - xo; int scaleheight = (int)(vncCanvas.getVisibleHeight() / scale + 1); if (scaleheight + yo > data.framebufferheight) scaleheight = data.framebufferheight - yo; canvas.drawBitmap(data.bitmapPixels, offset(xo, yo), data.framebufferwidth, xo, yo, scalewidth, scaleheight, false, null); } */ } if(data.vncCanvas.connection.getUseLocalCursor()) { setCursorRect(data.vncCanvas.mouseX, data.vncCanvas.mouseY); clipRect.set(cursorRect); if (canvas.clipRect(cursorRect)) { drawCursor(canvas); } } } } /** * Multiply this times total number of pixels to get estimate of process size with all buffers plus * safety factor */ static final int CAPACITY_MULTIPLIER = 7; /** * @param p * @param c */ public FullBufferBitmapData(RfbProto p, VncCanvas c, int capacity) { super(p, c); framebufferwidth=rfb.framebufferWidth; framebufferheight=rfb.framebufferHeight; bitmapwidth=framebufferwidth; bitmapheight=framebufferheight; android.util.Log.i("FBBM", "bitmapsize = ("+bitmapwidth+","+bitmapheight+")"); bitmapPixels = new int[framebufferwidth * framebufferheight]; } /* (non-Javadoc) * @see android.androidVNC.AbstractBitmapData#copyRect(android.graphics.Rect, android.graphics.Rect, android.graphics.Paint) */ @Override void copyRect(Rect src, Rect dest, Paint paint) { // TODO copy rect working? throw new RuntimeException( "copyrect Not implemented"); } /* (non-Javadoc) * @see android.androidVNC.AbstractBitmapData#createDrawable() */ @Override AbstractBitmapDrawable createDrawable() { return new Drawable(this); } /* (non-Javadoc) * @see android.androidVNC.AbstractBitmapData#drawRect(int, int, int, int, android.graphics.Paint) */ @Override void drawRect(int x, int y, int w, int h, Paint paint) { int color = paint.getColor(); //debug: color = Color.WHITE; int offset = offset(x,y); if (w > 10) { for (int j = 0; j < h; j++, offset += framebufferwidth) { Arrays.fill(bitmapPixels, offset, offset + w, color); } } else { for (int j = 0; j < h; j++, offset += framebufferwidth - w) { for (int k = 0; k < w; k++, offset++) { bitmapPixels[offset] = color; } } } } /* (non-Javadoc) * @see android.androidVNC.AbstractBitmapData#offset(int, int) */ @Override int offset(int x, int y) { return x + y * framebufferwidth; } /* (non-Javadoc) * @see android.androidVNC.AbstractBitmapData#scrollChanged(int, int) */ @Override void scrollChanged(int newx, int newy) { xoffset = newx; yoffset = newy; } /* (non-Javadoc) * @see android.androidVNC.AbstractBitmapData#syncScroll() */ @Override void syncScroll() { // Don't need to do anything here } /* (non-Javadoc) * @see android.androidVNC.AbstractBitmapData#updateBitmap(int, int, int, int) */ @Override void updateBitmap(int x, int y, int w, int h) { // Don't need to do anything here } /* (non-Javadoc) * @see android.androidVNC.AbstractBitmapData#validDraw(int, int, int, int) */ @Override boolean validDraw(int x, int y, int w, int h) { return true; } /* (non-Javadoc) * @see android.androidVNC.AbstractBitmapData#writeFullUpdateRequest(boolean) */ @Override void writeFullUpdateRequest(boolean incremental) throws IOException { rfb.writeFramebufferUpdateRequest(0, 0, framebufferwidth, framebufferheight, incremental); } }