|  | 
 | /* | 
 |  * Copyright 2006 The Android Open Source Project | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 |  | 
 | #include "SkDraw3D.h" | 
 | #include "SkAnimateMaker.h" | 
 | #include "SkCanvas.h" | 
 | #include "SkTypedArray.h" | 
 |  | 
 | #if SK_USE_CONDENSED_INFO == 0 | 
 |  | 
 | const SkMemberInfo Sk3D_Point::fInfo[] = { | 
 |     SK_MEMBER_ALIAS(x, fPoint.fX, Float), | 
 |     SK_MEMBER_ALIAS(y, fPoint.fY, Float), | 
 |     SK_MEMBER_ALIAS(z, fPoint.fZ, Float) | 
 | }; | 
 |  | 
 | #endif | 
 |  | 
 | DEFINE_NO_VIRTUALS_GET_MEMBER(Sk3D_Point); | 
 |  | 
 | Sk3D_Point::Sk3D_Point() { | 
 |     fPoint.set(0, 0, 0); | 
 | } | 
 |  | 
 | #if SK_USE_CONDENSED_INFO == 0 | 
 |  | 
 | const SkMemberInfo Sk3D_Camera::fInfo[] = { | 
 |     SK_MEMBER_ALIAS(axis, fCamera.fAxis, 3D_Point), | 
 |     SK_MEMBER(hackHeight, Float), | 
 |     SK_MEMBER(hackWidth, Float), | 
 |     SK_MEMBER_ALIAS(location, fCamera.fLocation, 3D_Point), | 
 |     SK_MEMBER_ALIAS(observer, fCamera.fObserver, 3D_Point), | 
 |     SK_MEMBER(patch, 3D_Patch), | 
 |     SK_MEMBER_ALIAS(zenith, fCamera.fZenith, 3D_Point), | 
 | }; | 
 |  | 
 | #endif | 
 |  | 
 | DEFINE_GET_MEMBER(Sk3D_Camera); | 
 |  | 
 | Sk3D_Camera::Sk3D_Camera() : hackWidth(0), hackHeight(0), patch(NULL) { | 
 | } | 
 |  | 
 | Sk3D_Camera::~Sk3D_Camera() { | 
 | } | 
 |  | 
 | bool Sk3D_Camera::draw(SkAnimateMaker& maker) { | 
 |     fCamera.update(); | 
 |     SkMatrix matrix; | 
 |     fCamera.patchToMatrix(patch->fPatch, &matrix); | 
 |     matrix.preTranslate(hackWidth / 2, -hackHeight / 2); | 
 |     matrix.postTranslate(hackWidth / 2, hackHeight / 2); | 
 |     maker.fCanvas->concat(matrix); | 
 |     return false; | 
 | } | 
 |  | 
 |  | 
 | enum Sk3D_Patch_Functions { | 
 |     SK_FUNCTION(rotateDegrees) | 
 | }; | 
 |  | 
 | const SkFunctionParamType Sk3D_Patch::fFunctionParameters[] = { | 
 |     (SkFunctionParamType) SkType_Float, | 
 |     (SkFunctionParamType) SkType_Float, | 
 |     (SkFunctionParamType) SkType_Float, | 
 |     (SkFunctionParamType) 0 // terminator for parameter list (there may be multiple parameter lists) | 
 | }; | 
 |  | 
 | #if SK_USE_CONDENSED_INFO == 0 | 
 |  | 
 | const SkMemberInfo Sk3D_Patch::fInfo[] = { | 
 |     SK_MEMBER_ALIAS(origin, fPatch.fOrigin, 3D_Point), | 
 |     SK_MEMBER_FUNCTION(rotateDegrees, Float), | 
 |     SK_MEMBER_ALIAS(u, fPatch.fU, 3D_Point), | 
 |     SK_MEMBER_ALIAS(v, fPatch.fV, 3D_Point) | 
 | }; | 
 |  | 
 | #endif | 
 |  | 
 | DEFINE_GET_MEMBER(Sk3D_Patch); | 
 |  | 
 | void Sk3D_Patch::executeFunction(SkDisplayable* target, int index, | 
 |         SkTDArray<SkScriptValue>& parameters, SkDisplayTypes type, | 
 |         SkScriptValue* ) { | 
 |     SkASSERT(target == this); | 
 |     switch (index) { | 
 |         case SK_FUNCTION(rotateDegrees): | 
 |             SkASSERT(parameters.count() == 3); | 
 |             SkASSERT(type == SkType_Float); | 
 |             fPatch.rotateDegrees(parameters[0].fOperand.fScalar, | 
 |                 parameters[1].fOperand.fScalar, parameters[2].fOperand.fScalar); | 
 |             break; | 
 |         default: | 
 |             SkASSERT(0); | 
 |     } | 
 | } | 
 |  | 
 | const SkFunctionParamType* Sk3D_Patch::getFunctionsParameters() { | 
 |     return fFunctionParameters; | 
 | } |