private void drawIconsOverCanvas(RenderingContext rc, Canvas cv) { int skewConstant = (int) rc.getDensityValue(16); int iconsW = rc.width / skewConstant; int iconsH = rc.height / skewConstant; int[] alreadyDrawnIcons = new int[iconsW * iconsH / 32]; for (IconDrawInfo icon : rc.iconsToDraw) { if (icon.resId != null) { Bitmap ico = RenderingIcons.getIcon(context, icon.resId); if (ico != null) { if (icon.y >= 0 && icon.y < rc.height && icon.x >= 0 && icon.x < rc.width) { int z = (((int) icon.x / skewConstant) + ((int) icon.y / skewConstant) * iconsW); int i = z / 32; if (i >= alreadyDrawnIcons.length) { continue; } int ind = alreadyDrawnIcons[i]; int b = z % 32; // check bit b if it is set if (((ind >> b) & 1) == 0) { alreadyDrawnIcons[i] = ind | (1 << b); if (rc.getDensityValue(1) != 1) { float left = icon.x - rc.getDensityValue(ico.getWidth() / 2); float top = icon.y - rc.getDensityValue(ico.getHeight() / 2); cv.drawBitmap( ico, null, new RectF( left, top, left + rc.getDensityValue(ico.getWidth()), top + rc.getDensityValue(ico.getHeight())), paintIcon); } else { cv.drawBitmap( ico, icon.x - ico.getWidth() / 2, icon.y - ico.getHeight() / 2, paintIcon); } } } } } if (rc.interrupted) { return; } } }