14b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet/*
24b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Copyright (C) 2010 The Android Open Source Project
34b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet *
44b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License");
54b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * you may not use this file except in compliance with the License.
64b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * You may obtain a copy of the License at
74b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet *
84b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet *      http://www.apache.org/licenses/LICENSE-2.0
94b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet *
104b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Unless required by applicable law or agreed to in writing, software
114b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS,
124b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * See the License for the specific language governing permissions and
144b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * limitations under the License.
154b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet */
164b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
174b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetpackage android.graphics;
184b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
194b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.layoutlib.bridge.impl.DelegateManager;
204b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport com.android.tools.layoutlib.annotations.LayoutlibDelegate;
214b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
224b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetimport android.graphics.Shader.TileMode;
234b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
244b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet/**
254b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Delegate implementing the native methods of android.graphics.Shader
264b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet *
274b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * Through the layoutlib_create tool, the original native methods of Shader have been replaced
284b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * by calls to methods of the same name in this delegate class.
294b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet *
304b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * This class behaves like the original native implementation, but in Java, keeping previously
314b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * native data into its own objects and mapping them to int that are sent back and forth between
324b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * it and the original Shader class.
334b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet *
344b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * This also serve as a base class for all Shader delegate classes.
354b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet *
364b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet * @see DelegateManager
374b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet *
384b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet */
394b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohetpublic abstract class Shader_Delegate {
404b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
414b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    // ---- delegate manager ----
424b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    protected static final DelegateManager<Shader_Delegate> sManager =
434b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            new DelegateManager<Shader_Delegate>(Shader_Delegate.class);
444b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
454b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    // ---- delegate helper data ----
464b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
474b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    // ---- delegate data ----
484b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    private Matrix_Delegate mLocalMatrix = null;
494b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
504b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    // ---- Public Helper methods ----
514b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
524b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    public static Shader_Delegate getDelegate(int nativeShader) {
534b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        return sManager.getDelegate(nativeShader);
544b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    }
554b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
564b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    /**
574b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet     * Returns the {@link TileMode} matching the given int.
584b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet     * @param tileMode the tile mode int value
594b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet     * @return the TileMode enum.
604b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet     */
614b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    public static TileMode getTileMode(int tileMode) {
624b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        for (TileMode tm : TileMode.values()) {
634b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            if (tm.nativeInt == tileMode) {
644b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet                return tm;
654b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            }
664b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        }
674b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
684b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        assert false;
694b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        return TileMode.CLAMP;
704b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    }
714b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
724b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    public abstract java.awt.Paint getJavaPaint();
734b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    public abstract boolean isSupported();
744b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    public abstract String getSupportMessage();
754b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
7659aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet    public boolean isValid() {
7759aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet        if (mLocalMatrix != null && mLocalMatrix.getAffineTransform().getDeterminant() == 0) {
7859aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet            return false;
7959aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet        }
8059aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet
8159aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet        return true;
8259aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet    }
8359aad78eae14939c169876b2f632d005f382cf7dXavier Ducrohet
844b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    // ---- native methods ----
854b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
864b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    @LayoutlibDelegate
87031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet    /*package*/ static void nativeDestructor(int native_shader) {
884b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        sManager.removeJavaReferenceFor(native_shader);
894b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    }
904b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
914b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    @LayoutlibDelegate
92031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet    /*package*/ static boolean nativeGetLocalMatrix(int native_shader, int matrix_instance) {
93031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet        // get the delegate from the native int.
94031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet        Shader_Delegate shaderDelegate = sManager.getDelegate(native_shader);
95031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet        if (shaderDelegate == null) {
96031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet            return false;
97031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet        }
98031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet
99031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet        // get the (optional) out matrix.
100031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet        Matrix_Delegate outMatrixDelegate = Matrix_Delegate.getDelegate(matrix_instance);
101031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet
102031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet        if (shaderDelegate.mLocalMatrix == null || shaderDelegate.mLocalMatrix.isIdentity()) {
103031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet            if (outMatrixDelegate != null) {
104031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet                outMatrixDelegate.reset();
105031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet            }
106031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet            return false;
107031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet        }
108031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet
109031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet        if (outMatrixDelegate != null) {
110031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet            outMatrixDelegate.set(shaderDelegate.mLocalMatrix);
111031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet        }
112031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet
113031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet        return true;
114031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet    }
115031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet
116031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet
117031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet    @LayoutlibDelegate
118031d2f8b6db5bf7b249ae1c9a72915bf2d3a8d7bXavier Ducrohet    /*package*/ static void nativeSetLocalMatrix(int native_shader, int matrix_instance) {
1194b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        // get the delegate from the native int.
1204b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        Shader_Delegate shaderDelegate = sManager.getDelegate(native_shader);
1214b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        if (shaderDelegate == null) {
1224b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            return;
1234b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        }
1244b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
1254b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        shaderDelegate.mLocalMatrix = Matrix_Delegate.getDelegate(matrix_instance);
1264b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    }
1274b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
1284b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    // ---- Private delegate/helper methods ----
1294b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
1304b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    protected java.awt.geom.AffineTransform getLocalMatrix() {
1314b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        if (mLocalMatrix != null) {
1324b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet            return mLocalMatrix.getAffineTransform();
1334b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        }
1344b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet
1354b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet        return new java.awt.geom.AffineTransform();
1364b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet    }
1374b52ec49fee79b0488d6a9eaaa4ea5d74ce90905Xavier Ducrohet}
138