/** * Called by canvas image implementations in {@link #ensureTexture} to either cause their texture * data to be reuploaded (in the simple case where the image is neither repeated nor mipmapped), * or their texture to be destroyed so that it is subsequently recreated with updated texture * data. */ protected void refreshTexture() { if (repeatX || repeatY || mipmapped) clearTexture(); else if (tex > 0) updateTexture(tex); }
@Override public int ensureTexture() { if (tex > 0) { return tex; } else if (!isReady()) { return 0; } else if (repeatX || repeatY || mipmapped) { return (tex = scaleTexture()); } else { return (tex = createMainTex()); } }
private int scaleTexture() { int scaledWidth = scale.scaledCeil(width()); int scaledHeight = scale.scaledCeil(height()); // GL requires pow2 on axes that repeat int width = GLUtil.nextPowerOfTwo(scaledWidth), height = GLUtil.nextPowerOfTwo(scaledHeight); // TODO: if width/height > platform_max_size, repeatedly scale by 0.5 until within bounds // platform_max_size = 1024 for iOS, GL10.GL_MAX_TEXTURE_SIZE on android, etc. // no need to scale if our source data is already a power of two if ((width == 0) && (height == 0)) { int reptex = createPow2RepTex(scaledWidth, scaledHeight, repeatX, repeatY, mipmapped); if (mipmapped) ctx.generateMipmap(reptex); return reptex; } // otherwise we need to scale our non-repeated texture, so load that normally int tex = createMainTex(); // width/height == 0 => already a power of two. if (width == 0) width = scaledWidth; if (height == 0) height = scaledHeight; // create our texture and point a new framebuffer at it try { return convertToRepTex(ctx, tex, width, height, repeatX, repeatY, mipmapped); } finally { // delete the non-repeated texture ctx.destroyTexture(tex); } }
@Override public void clearTexture() { // we may be in use on a non-WebGL platform, in which case we should NOOP if (ctx != null) super.clearTexture(); }
/** * Creates and populates a (not necessarily power of two) texture for use as our main texture. */ protected int createMainTex() { // the mipmaps flag is always false here because we only ever generate mipmaps for our // power-of-two textures; scaleTexture will use tex to create the POT texture, so tex should // not have mipmaps enabled, or it will hose up that process int tex = ctx.createTexture(false, false, false); updateTexture(tex); return tex; }
/** * Creates and populates a texture for use as our power-of-two texture. This is used when our * main image data is already power-of-two-sized. */ protected int createPow2RepTex(int width, int height, boolean repeatX, boolean repeatY, boolean mipmapped) { int powtex = ctx.createTexture(width, height, repeatX, repeatY, mipmapped); updateTexture(powtex); return powtex; }