1251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet/*
2251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Copyright (C) 2010 The Android Open Source Project
3251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet *
4251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License");
5251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * you may not use this file except in compliance with the License.
6251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * You may obtain a copy of the License at
7251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet *
8251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet *      http://www.apache.org/licenses/LICENSE-2.0
9251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet *
10251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Unless required by applicable law or agreed to in writing, software
11251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS,
12251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * See the License for the specific language governing permissions and
14251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * limitations under the License.
15251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet */
16251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
17251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohetpackage android.graphics;
18251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
19c2e9651bf386a1f7bf7fc706cf5424950570470cXavier Ducrohetimport com.android.layoutlib.bridge.impl.DelegateManager;
209a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohetimport com.android.tools.layoutlib.annotations.LayoutlibDelegate;
21251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
22d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohetimport android.graphics.Shader.TileMode;
23d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet
24251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet/**
25251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Delegate implementing the native methods of android.graphics.Shader
26251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet *
27251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * Through the layoutlib_create tool, the original native methods of Shader have been replaced
28251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * by calls to methods of the same name in this delegate class.
29251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet *
30251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * This class behaves like the original native implementation, but in Java, keeping previously
31251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * native data into its own objects and mapping them to int that are sent back and forth between
32251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * it and the original Shader class.
33251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet *
34251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * This also serve as a base class for all Shader delegate classes.
35251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet *
36251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet * @see DelegateManager
37251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet *
38251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet */
39251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohetpublic abstract class Shader_Delegate {
40251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
41251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    // ---- delegate manager ----
42251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    protected static final DelegateManager<Shader_Delegate> sManager =
43f0a53435f14d23d9555fc46014352ee6a7baa647Xavier Ducrohet            new DelegateManager<Shader_Delegate>(Shader_Delegate.class);
44251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
45251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    // ---- delegate helper data ----
46251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
47251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    // ---- delegate data ----
48cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet    private Matrix_Delegate mLocalMatrix = null;
49251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
50251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    // ---- Public Helper methods ----
51251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
52251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    public static Shader_Delegate getDelegate(int nativeShader) {
53251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet        return sManager.getDelegate(nativeShader);
54251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
55251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
56d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet    /**
57d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet     * Returns the {@link TileMode} matching the given int.
58d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet     * @param tileMode the tile mode int value
59d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet     * @return the TileMode enum.
60d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet     */
61d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet    public static TileMode getTileMode(int tileMode) {
62d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet        for (TileMode tm : TileMode.values()) {
63d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet            if (tm.nativeInt == tileMode) {
64d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet                return tm;
65d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet            }
66d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet        }
67d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet
68d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet        assert false;
69d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet        return TileMode.CLAMP;
70d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet    }
71d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet
72251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    public abstract java.awt.Paint getJavaPaint();
73d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet    public abstract boolean isSupported();
74d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet    public abstract String getSupportMessage();
75251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
76251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    // ---- native methods ----
77251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
789a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
79251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    /*package*/ static void nativeDestructor(int native_shader, int native_skiaShader) {
80cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        sManager.removeJavaReferenceFor(native_shader);
81251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
82251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
839a4fe29c8d92014d2d9a848e9116b8cc9d0842f9Xavier Ducrohet    @LayoutlibDelegate
84251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    /*package*/ static void nativeSetLocalMatrix(int native_shader, int native_skiaShader,
85251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet            int matrix_instance) {
86251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet        // get the delegate from the native int.
87251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet        Shader_Delegate shaderDelegate = sManager.getDelegate(native_shader);
88251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet        if (shaderDelegate == null) {
89251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet            return;
90251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet        }
91251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
92cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        shaderDelegate.mLocalMatrix = Matrix_Delegate.getDelegate(matrix_instance);
93251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    }
94251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
95251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet    // ---- Private delegate/helper methods ----
96251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet
97d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet    protected java.awt.geom.AffineTransform getLocalMatrix() {
98cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet        if (mLocalMatrix != null) {
99cc4977d0fdaf657907912fd6cc2f9426dc8d2e36Xavier Ducrohet            return mLocalMatrix.getAffineTransform();
100d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet        }
101d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet
102d348b6eaa98e23cb38d90906df109aaa2d20ea7fXavier Ducrohet        return new java.awt.geom.AffineTransform();
103d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet    }
104d9c64369cf9be6568af2d79c35fb470cc261730dXavier Ducrohet
105251d2e99245095369b52d891a660b2ed270f02e0Xavier Ducrohet}
106