summaryrefslogtreecommitdiffstats
path: root/awt/org/apache/harmony/awt/gl/render/NativeImageBlitter.java
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2008-10-21 07:00:00 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2008-10-21 07:00:00 -0700
commit7c1b96a165f970a09ed239bb4fb3f1b0d8f2a407 (patch)
treedf5a6539447324de36e95b057d6b9f0361b7a250 /awt/org/apache/harmony/awt/gl/render/NativeImageBlitter.java
downloadframeworks_native-7c1b96a165f970a09ed239bb4fb3f1b0d8f2a407.zip
frameworks_native-7c1b96a165f970a09ed239bb4fb3f1b0d8f2a407.tar.gz
frameworks_native-7c1b96a165f970a09ed239bb4fb3f1b0d8f2a407.tar.bz2
Initial Contribution
Diffstat (limited to 'awt/org/apache/harmony/awt/gl/render/NativeImageBlitter.java')
-rw-r--r--awt/org/apache/harmony/awt/gl/render/NativeImageBlitter.java218
1 files changed, 218 insertions, 0 deletions
diff --git a/awt/org/apache/harmony/awt/gl/render/NativeImageBlitter.java b/awt/org/apache/harmony/awt/gl/render/NativeImageBlitter.java
new file mode 100644
index 0000000..b0ebc97
--- /dev/null
+++ b/awt/org/apache/harmony/awt/gl/render/NativeImageBlitter.java
@@ -0,0 +1,218 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+/**
+ * @author Igor V. Stolyarov
+ * @version $Revision$
+ * Created on 26.11.2005
+ *
+ */
+package org.apache.harmony.awt.gl.render;
+
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Composite;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BufferedImage;
+
+import org.apache.harmony.awt.gl.ImageSurface;
+import org.apache.harmony.awt.gl.MultiRectArea;
+import org.apache.harmony.awt.gl.Surface;
+import org.apache.harmony.awt.gl.XORComposite;
+
+/**
+ * This kind of blitters is intended for drawing one image on the buffered
+ * or volatile image. For the moment we can blit natively Buffered Images which
+ * have sRGB, Linear_RGB, Linear_Gray Color Space and type different
+ * from BufferedImage.TYPE_CUSTOM, Volatile Images and Images which received
+ * using Toolkit and Component classes.
+ */
+public class NativeImageBlitter implements Blitter {
+
+
+ final static NativeImageBlitter inst = new NativeImageBlitter();
+
+ public static NativeImageBlitter getInstance(){
+ return inst;
+ }
+
+ public void blit(int srcX, int srcY, Surface srcSurf, int dstX, int dstY,
+ Surface dstSurf, int width, int height, AffineTransform sysxform,
+ AffineTransform xform, Composite comp, Color bgcolor,
+ MultiRectArea clip) {
+
+ if(!srcSurf.isNativeDrawable()){
+ JavaBlitter.inst.blit(srcX, srcY, srcSurf, dstX, dstY, dstSurf, width, height,
+ sysxform, xform, comp, bgcolor, clip);
+ }else{
+ if(xform == null){
+ blit(srcX, srcY, srcSurf, dstX, dstY, dstSurf, width, height,
+ sysxform, comp, bgcolor, clip);
+ }else{
+ double scaleX = xform.getScaleX();
+ double scaleY = xform.getScaleY();
+ double scaledX = dstX / scaleX;
+ double scaledY = dstY / scaleY;
+ AffineTransform at = new AffineTransform();
+ at.setToTranslation(scaledX, scaledY);
+ xform.concatenate(at);
+ sysxform.concatenate(xform);
+ blit(srcX, srcY, srcSurf, 0, 0, dstSurf, width, height,
+ sysxform, comp, bgcolor, clip);
+ }
+ }
+ }
+
+ public void blit(int srcX, int srcY, Surface srcSurf, int dstX, int dstY,
+ Surface dstSurf, int width, int height, AffineTransform sysxform,
+ Composite comp, Color bgcolor, MultiRectArea clip) {
+
+ if(!srcSurf.isNativeDrawable()){
+ JavaBlitter.inst.blit(srcX, srcY, srcSurf, dstX, dstY, dstSurf, width, height,
+ sysxform, comp, bgcolor, clip);
+ }else{
+ int type = sysxform.getType();
+ switch(type){
+ case AffineTransform.TYPE_TRANSLATION:
+ dstX += sysxform.getTranslateX();
+ dstY += sysxform.getTranslateY();
+ case AffineTransform.TYPE_IDENTITY:
+ blit(srcX, srcY, srcSurf, dstX, dstY, dstSurf,
+ width, height, comp, bgcolor, clip);
+ break;
+ default:
+ // TODO Need to realize Affine Transformation
+ if(srcSurf instanceof ImageSurface){
+ JavaBlitter.inst.blit(srcX, srcY, srcSurf, dstX, dstY,
+ dstSurf, width, height,
+ sysxform, comp, bgcolor, clip);
+ }else{
+ int w = srcSurf.getWidth();
+ int h = srcSurf.getHeight();
+ BufferedImage tmp = new BufferedImage(w, h,
+ BufferedImage.TYPE_INT_RGB);
+ Surface tmpSurf = Surface.getImageSurface(tmp);
+ blit(0, 0, srcSurf, 0, 0, tmpSurf,
+ w, h, AlphaComposite.SrcOver, null, null);
+ JavaBlitter.inst.blit(srcX, srcY, tmpSurf, dstX, dstY,
+ dstSurf, width, height,
+ sysxform, comp, bgcolor, clip);
+ }
+ }
+ }
+ }
+
+ public void blit(int srcX, int srcY, Surface srcSurf, int dstX, int dstY,
+ Surface dstSurf, int width, int height, Composite comp,
+ Color bgcolor, MultiRectArea clip) {
+
+ if(!srcSurf.isNativeDrawable()){
+ JavaBlitter.inst.blit(srcX, srcY, srcSurf, dstX, dstY, dstSurf, width, height,
+ comp, bgcolor, clip);
+ }else{
+ long dstSurfStruct = dstSurf.getSurfaceDataPtr();
+ Object dstData = dstSurf.getData();
+ int clipRects[];
+ if(clip != null){
+ clipRects = clip.rect;
+ }else{
+ clipRects = new int[]{5, 0, 0, dstSurf.getWidth(),
+ dstSurf.getHeight()};
+ }
+
+ if(!(srcSurf instanceof ImageSurface)){
+ srcSurf = srcSurf.getImageSurface();
+ if(bgcolor != null){
+ bgcolor = null;
+ }
+ }
+
+ long srcSurfStruct = srcSurf.getSurfaceDataPtr();
+ Object srcData = srcSurf.getData();
+ if(comp instanceof AlphaComposite){
+ AlphaComposite ac = (AlphaComposite) comp;
+ int compType = ac.getRule();
+ float alpha = ac.getAlpha();
+ if(bgcolor != null){
+ bltBG(srcX, srcY, srcSurfStruct, srcData,
+ dstX, dstY, dstSurfStruct, dstData,
+ width, height, bgcolor.getRGB(),
+ compType, alpha, clipRects, srcSurf.invalidated());
+ dstSurf.invalidate();
+ srcSurf.validate();
+ }else{
+ blt(srcX, srcY, srcSurfStruct, srcData,
+ dstX, dstY, dstSurfStruct, dstData,
+ width, height, compType, alpha,
+ clipRects, srcSurf.invalidated());
+ dstSurf.invalidate();
+ srcSurf.validate();
+ }
+ }else if(comp instanceof XORComposite){
+ XORComposite xcomp = (XORComposite) comp;
+ xor(srcX, srcY, srcSurfStruct, srcData,
+ dstX, dstY, dstSurfStruct, dstData,
+ width, height, xcomp.getXORColor().getRGB(),
+ clipRects, srcSurf.invalidated());
+ dstSurf.invalidate();
+ srcSurf.validate();
+ }else{
+ if(srcSurf instanceof ImageSurface){
+ JavaBlitter.inst.blit(srcX, srcY, srcSurf, dstX, dstY,
+ dstSurf, width, height,
+ comp, bgcolor, clip);
+ }else{
+ int w = srcSurf.getWidth();
+ int h = srcSurf.getHeight();
+ BufferedImage tmp = new BufferedImage(w, h,
+ BufferedImage.TYPE_INT_RGB);
+ Surface tmpSurf = Surface.getImageSurface(tmp);
+ long tmpSurfStruct = tmpSurf.getSurfaceDataPtr();
+ Object tmpData = tmpSurf.getData();
+ int tmpClip[] = new int[]{5, 0, 0, srcSurf.getWidth(),
+ srcSurf.getHeight()};
+
+ blt(0, 0, srcSurfStruct, srcData, 0, 0,
+ tmpSurfStruct, tmpData, w, h,
+ AlphaComposite.SRC_OVER,
+ 1.0f, tmpClip, srcSurf.invalidated());
+ srcSurf.validate();
+ JavaBlitter.inst.blit(srcX, srcY, tmpSurf, dstX, dstY,
+ dstSurf, width, height,
+ comp, bgcolor, clip);
+ }
+ }
+ }
+
+ }
+
+ private native void bltBG(int srcX, int srcY, long srsSurfDataPtr,
+ Object srcData, int dstX, int dstY, long dstSurfDataPtr,
+ Object dstData, int width, int height, int bgcolor,
+ int compType, float alpha, int clip[], boolean invalidated);
+
+ private native void blt(int srcX, int srcY, long srsSurfDataPtr,
+ Object srcData, int dstX, int dstY, long dstSurfDataPtr,
+ Object dstData, int width, int height, int compType,
+ float alpha, int clip[], boolean invalidated);
+
+ private native void xor(int srcX, int srcY, long srsSurfDataPtr,
+ Object srcData, int dstX, int dstY, long dstSurfDataPtr,
+ Object dstData, int width, int height, int xorcolor,
+ int clip[], boolean invalidated);
+
+
+}