@@ -192,6 +192,98 @@ public void resetClipTracking() {
192192 lastClipShape = null ;
193193 }
194194
195+ @ Override
196+ public boolean isTransformSupported () {
197+ return true ;
198+ }
199+
200+ @ Override
201+ public boolean isTransformSupported (Object graphics ) {
202+ return true ;
203+ }
204+
205+ @ Override
206+ public Object makeTransformIdentity () {
207+ return new TestTransform ();
208+ }
209+
210+ @ Override
211+ public void setTransformIdentity (Object transform ) {
212+ ((TestTransform ) transform ).setIdentity ();
213+ }
214+
215+ @ Override
216+ public Object makeTransformTranslation (float translateX , float translateY , float translateZ ) {
217+ TestTransform transform = new TestTransform ();
218+ transform .setTranslation (translateX , translateY , translateZ );
219+ return transform ;
220+ }
221+
222+ @ Override
223+ public void setTransformTranslation (Object transform , float translateX , float translateY , float translateZ ) {
224+ ((TestTransform ) transform ).setTranslation (translateX , translateY , translateZ );
225+ }
226+
227+ @ Override
228+ public Object makeTransformScale (float scaleX , float scaleY , float scaleZ ) {
229+ TestTransform transform = new TestTransform ();
230+ transform .setScale (scaleX , scaleY , scaleZ );
231+ return transform ;
232+ }
233+
234+ @ Override
235+ public void setTransformScale (Object transform , float scaleX , float scaleY , float scaleZ ) {
236+ ((TestTransform ) transform ).setScale (scaleX , scaleY , scaleZ );
237+ }
238+
239+ @ Override
240+ public Object makeTransformAffine (double m00 , double m10 , double m01 , double m11 , double m02 , double m12 ) {
241+ TestTransform transform = new TestTransform ();
242+ transform .setAffine ((float ) m00 , (float ) m01 , (float ) m02 , (float ) m10 , (float ) m11 , (float ) m12 );
243+ return transform ;
244+ }
245+
246+ @ Override
247+ public Object makeTransformInverse (Object nativeTransform ) {
248+ return ((TestTransform ) nativeTransform ).createInverse ();
249+ }
250+
251+ @ Override
252+ public void setTransformInverse (Object nativeTransform ) {
253+ ((TestTransform ) nativeTransform ).invert ();
254+ }
255+
256+ @ Override
257+ public void concatenateTransform (Object left , Object right ) {
258+ ((TestTransform ) left ).concatenate ((TestTransform ) right );
259+ }
260+
261+ @ Override
262+ public void copyTransform (Object src , Object dest ) {
263+ ((TestTransform ) dest ).copyFrom ((TestTransform ) src );
264+ }
265+
266+ @ Override
267+ public boolean transformNativeEqualsImpl (Object t1 , Object t2 ) {
268+ if (t1 == t2 ) {
269+ return true ;
270+ }
271+ if (t1 == null || t2 == null ) {
272+ return false ;
273+ }
274+ return ((TestTransform ) t1 ).equals ((TestTransform ) t2 );
275+ }
276+
277+ @ Override
278+ public void transformPoint (Object nativeTransform , float [] in , float [] out ) {
279+ if (nativeTransform == null ) {
280+ int len = Math .min (in .length , out .length );
281+ System .arraycopy (in , 0 , out , 0 , len );
282+ return ;
283+ }
284+ ((TestTransform ) nativeTransform ).transformPoint (in , out );
285+ }
286+
195287 // -----------------------------------------------------------------
196288 // CodenameOneImplementation abstract methods
197289 // -----------------------------------------------------------------
@@ -523,6 +615,31 @@ public Object createFont(int face, int style, int size) {
523615 return new TestFont (defaultFont .charWidth , defaultFont .height );
524616 }
525617
618+ @ Override
619+ public Object loadTrueTypeFont (String fontName , String fileName ) {
620+ return new TestFont (defaultFont .charWidth , defaultFont .height );
621+ }
622+
623+ @ Override
624+ public Object deriveTrueTypeFont (Object font , float size , int weight ) {
625+ return new TestFont (defaultFont .charWidth , defaultFont .height );
626+ }
627+
628+ @ Override
629+ public Object loadNativeFont (String lookup ) {
630+ return new TestFont (defaultFont .charWidth , defaultFont .height );
631+ }
632+
633+ @ Override
634+ public boolean isTrueTypeSupported () {
635+ return true ;
636+ }
637+
638+ @ Override
639+ public boolean isNativeFontSchemeSupported () {
640+ return true ;
641+ }
642+
526643 @ Override
527644 public Object connect (String url , boolean read , boolean write ) throws IOException {
528645 TestConnection connection = connections .computeIfAbsent (url , TestConnection ::new );
@@ -869,6 +986,174 @@ public static final class TestGraphics {
869986 }
870987 }
871988
989+ private static final class TestTransform {
990+ private float m00 ;
991+ private float m01 ;
992+ private float m02 ;
993+ private float m10 ;
994+ private float m11 ;
995+ private float m12 ;
996+ private float m20 ;
997+ private float m21 ;
998+ private float m22 ;
999+ private float translateZ ;
1000+
1001+ TestTransform () {
1002+ setIdentity ();
1003+ }
1004+
1005+ void setIdentity () {
1006+ m00 = 1f ;
1007+ m01 = 0f ;
1008+ m02 = 0f ;
1009+ m10 = 0f ;
1010+ m11 = 1f ;
1011+ m12 = 0f ;
1012+ m20 = 0f ;
1013+ m21 = 0f ;
1014+ m22 = 1f ;
1015+ translateZ = 0f ;
1016+ }
1017+
1018+ void setTranslation (float tx , float ty , float tz ) {
1019+ setIdentity ();
1020+ m02 = tx ;
1021+ m12 = ty ;
1022+ translateZ = tz ;
1023+ }
1024+
1025+ void setScale (float sx , float sy , float sz ) {
1026+ setIdentity ();
1027+ m00 = sx ;
1028+ m11 = sy ;
1029+ m22 = sz ;
1030+ }
1031+
1032+ void setAffine (float nm00 , float nm01 , float nm02 , float nm10 , float nm11 , float nm12 ) {
1033+ m00 = nm00 ;
1034+ m01 = nm01 ;
1035+ m02 = nm02 ;
1036+ m10 = nm10 ;
1037+ m11 = nm11 ;
1038+ m12 = nm12 ;
1039+ m20 = 0f ;
1040+ m21 = 0f ;
1041+ m22 = 1f ;
1042+ translateZ = 0f ;
1043+ }
1044+
1045+ void copyFrom (TestTransform other ) {
1046+ m00 = other .m00 ;
1047+ m01 = other .m01 ;
1048+ m02 = other .m02 ;
1049+ m10 = other .m10 ;
1050+ m11 = other .m11 ;
1051+ m12 = other .m12 ;
1052+ m20 = other .m20 ;
1053+ m21 = other .m21 ;
1054+ m22 = other .m22 ;
1055+ translateZ = other .translateZ ;
1056+ }
1057+
1058+ TestTransform createInverse () {
1059+ TestTransform inverse = new TestTransform ();
1060+ inverse .copyFrom (this );
1061+ inverse .invert ();
1062+ return inverse ;
1063+ }
1064+
1065+ void invert () {
1066+ float det = m00 * m11 - m01 * m10 ;
1067+ if (Math .abs (det ) < 1.0e-6f ) {
1068+ setIdentity ();
1069+ return ;
1070+ }
1071+ float invDet = 1f / det ;
1072+ float nm00 = m11 * invDet ;
1073+ float nm01 = -m01 * invDet ;
1074+ float nm02 = (m01 * m12 - m11 * m02 ) * invDet ;
1075+ float nm10 = -m10 * invDet ;
1076+ float nm11 = m00 * invDet ;
1077+ float nm12 = (m10 * m02 - m00 * m12 ) * invDet ;
1078+ m00 = nm00 ;
1079+ m01 = nm01 ;
1080+ m02 = nm02 ;
1081+ m10 = nm10 ;
1082+ m11 = nm11 ;
1083+ m12 = nm12 ;
1084+ translateZ = -translateZ ;
1085+ }
1086+
1087+ void concatenate (TestTransform right ) {
1088+ float nm00 = m00 * right .m00 + m01 * right .m10 ;
1089+ float nm01 = m00 * right .m01 + m01 * right .m11 ;
1090+ float nm02 = m00 * right .m02 + m01 * right .m12 + m02 ;
1091+ float nm10 = m10 * right .m00 + m11 * right .m10 ;
1092+ float nm11 = m10 * right .m01 + m11 * right .m11 ;
1093+ float nm12 = m10 * right .m02 + m11 * right .m12 + m12 ;
1094+ float nm20 = m20 * right .m00 + m21 * right .m10 + m22 * right .m20 ;
1095+ float nm21 = m20 * right .m01 + m21 * right .m11 + m22 * right .m21 ;
1096+ float nm22 = m20 * right .m02 + m21 * right .m12 + m22 * right .m22 ;
1097+ m00 = nm00 ;
1098+ m01 = nm01 ;
1099+ m02 = nm02 ;
1100+ m10 = nm10 ;
1101+ m11 = nm11 ;
1102+ m12 = nm12 ;
1103+ m20 = nm20 ;
1104+ m21 = nm21 ;
1105+ m22 = nm22 ;
1106+ translateZ = translateZ + right .translateZ ;
1107+ }
1108+
1109+ void transformPoint (float [] in , float [] out ) {
1110+ float x = in [0 ];
1111+ float y = in [1 ];
1112+ out [0 ] = m00 * x + m01 * y + m02 ;
1113+ out [1 ] = m10 * x + m11 * y + m12 ;
1114+ if (in .length > 2 && out .length > 2 ) {
1115+ float z = in [2 ];
1116+ out [2 ] = m22 * z + translateZ ;
1117+ }
1118+ }
1119+
1120+ @ Override
1121+ public boolean equals (Object obj ) {
1122+ if (this == obj ) {
1123+ return true ;
1124+ }
1125+ if (!(obj instanceof TestTransform )) {
1126+ return false ;
1127+ }
1128+ TestTransform other = (TestTransform ) obj ;
1129+ return Float .compare (m00 , other .m00 ) == 0
1130+ && Float .compare (m01 , other .m01 ) == 0
1131+ && Float .compare (m02 , other .m02 ) == 0
1132+ && Float .compare (m10 , other .m10 ) == 0
1133+ && Float .compare (m11 , other .m11 ) == 0
1134+ && Float .compare (m12 , other .m12 ) == 0
1135+ && Float .compare (m20 , other .m20 ) == 0
1136+ && Float .compare (m21 , other .m21 ) == 0
1137+ && Float .compare (m22 , other .m22 ) == 0
1138+ && Float .compare (translateZ , other .translateZ ) == 0 ;
1139+ }
1140+
1141+ @ Override
1142+ public int hashCode () {
1143+ int result = Float .floatToIntBits (m00 );
1144+ result = 31 * result + Float .floatToIntBits (m01 );
1145+ result = 31 * result + Float .floatToIntBits (m02 );
1146+ result = 31 * result + Float .floatToIntBits (m10 );
1147+ result = 31 * result + Float .floatToIntBits (m11 );
1148+ result = 31 * result + Float .floatToIntBits (m12 );
1149+ result = 31 * result + Float .floatToIntBits (m20 );
1150+ result = 31 * result + Float .floatToIntBits (m21 );
1151+ result = 31 * result + Float .floatToIntBits (m22 );
1152+ result = 31 * result + Float .floatToIntBits (translateZ );
1153+ return result ;
1154+ }
1155+ }
1156+
8721157 public static final class TestFont {
8731158 final int charWidth ;
8741159 final int height ;
0 commit comments