/**
* Copyright 2011 The ForPlay Authors
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package forplay.android;
import forplay.core.Asserts;
import forplay.core.Image;
import forplay.core.ImageLayer;
class AndroidImageLayer extends AndroidLayer implements ImageLayer {
private float width, height;
private boolean widthSet, heightSet;
private float sx, sy, sw, sh;
private boolean sourceRectSet;
private boolean repeatX, repeatY;
private AndroidImage image;
AndroidImageLayer() {
}
AndroidImageLayer(AndroidImage image) {
this.image = image;
}
@Override
public void clearHeight() {
heightSet = false;
}
@Override
public void clearSourceRect() {
sourceRectSet = false;
}
@Override
public void clearWidth() {
widthSet = false;
}
@Override
public Image image() {
return image;
}
@Override
public void setHeight(float height) {
Asserts.checkArgument(height > 0, "Height must be > 0");
heightSet = true;
if (this.height != height) {
this.height = height;
}
}
@Override
public void setImage(Image image) {
Asserts.checkArgument(image instanceof AndroidImage);
this.image = (AndroidImage) image;
}
@Override
public void setRepeatX(boolean repeat) {
Asserts.checkArgument(!repeat || !sourceRectSet, "Cannot repeat when source rect is used");
if (repeatX != repeat) {
repeatX = repeat;
}
}
@Override
public void setRepeatY(boolean repeat) {
Asserts.checkArgument(!repeat || !sourceRectSet, "Cannot repeat when source rect is used");
if (repeatY != repeat) {
repeatY = repeat;
}
}
@Override
public void setSize(float width, float height) {
setWidth(width);
setHeight(height);
}
@Override
public void setSourceRect(float sx, float sy, float sw, float sh) {
Asserts.checkState(!repeatX && !repeatY, "Cannot use source rect when repeating x or y");
sourceRectSet = true;
this.sx = sx;
this.sy = sy;
this.sw = sw;
this.sh = sh;
}
@Override
public void setWidth(float width) {
Asserts.checkArgument(width > 0, "Width must be > 0");
widthSet = true;
if (this.width != width) {
this.width = width;
}
}
@Override
void paint(AndroidCanvas canvas) {
if (!visible()) return;
canvas.save();
transform(canvas);
canvas.setAlpha(canvas.alpha() * alpha);
float dw = widthSet ? width : image.width();
float dh = heightSet ? height : image.height();
if (repeatX || repeatY) {
// TODO(jgw): something to make this repeat properly.
canvas.drawImage(image, 0, 0, dw, dh);
} else if (sourceRectSet) {
canvas.drawImage(image, 0, 0, dw, dh, sx, sy, sw, sh);
} else {
canvas.drawImage(image, 0, 0);
}
canvas.restore();
}
@Override
public float width() {
Asserts.checkNotNull(image, "Image must not be null");
if (widthSet) {
return width;
} else {
return image.width();
}
}
@Override
public float height() {
Asserts.checkNotNull(image, "Image must not be null");
if (heightSet) {
return height;
} else {
return image.height();
}
}
@Override
public float scaledWidth() {
return transform.scaleX() * width();
}
@Override
public float scaledHeight() {
return transform().scaleY() * height();
}
}