1aeb094b520d8ea49b74129927578f18f758c873eJason Sams/* 2a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project 3aeb094b520d8ea49b74129927578f18f758c873eJason Sams * 4aeb094b520d8ea49b74129927578f18f758c873eJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5aeb094b520d8ea49b74129927578f18f758c873eJason Sams * you may not use this file except in compliance with the License. 6aeb094b520d8ea49b74129927578f18f758c873eJason Sams * You may obtain a copy of the License at 7aeb094b520d8ea49b74129927578f18f758c873eJason Sams * 8aeb094b520d8ea49b74129927578f18f758c873eJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9aeb094b520d8ea49b74129927578f18f758c873eJason Sams * 10aeb094b520d8ea49b74129927578f18f758c873eJason Sams * Unless required by applicable law or agreed to in writing, software 11aeb094b520d8ea49b74129927578f18f758c873eJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12aeb094b520d8ea49b74129927578f18f758c873eJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aeb094b520d8ea49b74129927578f18f758c873eJason Sams * See the License for the specific language governing permissions and 14aeb094b520d8ea49b74129927578f18f758c873eJason Sams * limitations under the License. 15aeb094b520d8ea49b74129927578f18f758c873eJason Sams */ 16aeb094b520d8ea49b74129927578f18f758c873eJason Sams 17aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "rsContext.h" 18aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "rsScriptC.h" 1987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix4x4.h" 2087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix3x3.h" 2187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix2x2.h" 224edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk#include "rsMesh.h" 234edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk#include "rsgApiStructs.h" 24aeb094b520d8ea49b74129927578f18f758c873eJason Sams 25a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdVertexArray.h" 26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdShaderCache.h" 27a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdCore.h" 28aeb094b520d8ea49b74129927578f18f758c873eJason Sams 29aeb094b520d8ea49b74129927578f18f758c873eJason Sams#define GL_GLEXT_PROTOTYPES 30aeb094b520d8ea49b74129927578f18f758c873eJason Sams 31aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/gl.h> 32aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/glext.h> 33aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2.h> 34aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2ext.h> 35aeb094b520d8ea49b74129927578f18f758c873eJason Sams 36aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <time.h> 37aeb094b520d8ea49b74129927578f18f758c873eJason Sams 3887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace android { 3987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace renderscript { 40aeb094b520d8ea49b74129927578f18f758c873eJason Sams 41aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 42aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Context 43aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 44aeb094b520d8ea49b74129927578f18f758c873eJason Sams 45709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindTexture(Context *rsc, ProgramFragment *pf, uint32_t slot, Allocation *a) { 4687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ_OR_NULL(a); 4787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(pf); 4887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams pf->bindTexture(rsc, slot, a); 49aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 50aeb094b520d8ea49b74129927578f18f758c873eJason Sams 51709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindConstant(Context *rsc, ProgramFragment *pf, uint32_t slot, Allocation *a) { 52a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk CHECK_OBJ_OR_NULL(a); 53a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk CHECK_OBJ(pf); 54a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk pf->bindAllocation(rsc, a, slot); 55a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk} 56a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk 57709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindConstant(Context *rsc, ProgramVertex *pv, uint32_t slot, Allocation *a) { 58a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk CHECK_OBJ_OR_NULL(a); 598e6bde735d3c0024c36beff668e1588803657357Alex Sakhartchouk CHECK_OBJ(pv); 608e6bde735d3c0024c36beff668e1588803657357Alex Sakhartchouk pv->bindAllocation(rsc, a, slot); 61a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk} 62a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk 63709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindSampler(Context *rsc, ProgramFragment *pf, uint32_t slot, Sampler *s) { 64605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ_OR_NULL(vs); 65605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ(vpf); 6687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams pf->bindSampler(rsc, slot, s); 67aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 68aeb094b520d8ea49b74129927578f18f758c873eJason Sams 69709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindProgramStore(Context *rsc, ProgramStore *ps) { 7087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ_OR_NULL(ps); 7187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramStore(ps); 72aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 73aeb094b520d8ea49b74129927578f18f758c873eJason Sams 74709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindProgramFragment(Context *rsc, ProgramFragment *pf) { 75605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ_OR_NULL(pf); 7687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramFragment(pf); 77aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 78aeb094b520d8ea49b74129927578f18f758c873eJason Sams 79709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindProgramVertex(Context *rsc, ProgramVertex *pv) { 80605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ_OR_NULL(pv); 8187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramVertex(pv); 82aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 83aeb094b520d8ea49b74129927578f18f758c873eJason Sams 84709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindProgramRaster(Context *rsc, ProgramRaster *pr) { 8587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ_OR_NULL(pr); 8687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramRaster(pr); 87aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 88aeb094b520d8ea49b74129927578f18f758c873eJason Sams 89709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindFrameBufferObjectColorTarget(Context *rsc, Allocation *a, uint32_t slot) { 907d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk CHECK_OBJ(va); 9187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->mFBOCache.bindColorTarget(rsc, a, slot); 92a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 937d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 947d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 95709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindFrameBufferObjectDepthTarget(Context *rsc, Allocation *a) { 967d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk CHECK_OBJ(va); 9787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->mFBOCache.bindDepthTarget(rsc, a); 98a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 997d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 1007d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 101709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrClearFrameBufferObjectColorTarget(Context *rsc, uint32_t slot) { 10244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes rsc->mFBOCache.bindColorTarget(rsc, nullptr, slot); 103a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 1047d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 1057d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 106709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrClearFrameBufferObjectDepthTarget(Context *rsc) { 10744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes rsc->mFBOCache.bindDepthTarget(rsc, nullptr); 108a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 1097d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 1107d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 111709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrClearFrameBufferObjectTargets(Context *rsc) { 1127d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk rsc->mFBOCache.resetAll(rsc); 113a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 1147d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 1157d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 116aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 117aeb094b520d8ea49b74129927578f18f758c873eJason Sams// VP 118aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 119aeb094b520d8ea49b74129927578f18f758c873eJason Sams 120709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrVpLoadProjectionMatrix(Context *rsc, const rsc_Matrix *m) { 12160709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->setProjectionMatrix(rsc, m); 122a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller} 123a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller 124709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrVpLoadModelMatrix(Context *rsc, const rsc_Matrix *m) { 12560709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->setModelviewMatrix(rsc, m); 126aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 127aeb094b520d8ea49b74129927578f18f758c873eJason Sams 128709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrVpLoadTextureMatrix(Context *rsc, const rsc_Matrix *m) { 12960709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->setTextureMatrix(rsc, m); 130aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 131aeb094b520d8ea49b74129927578f18f758c873eJason Sams 132709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrPfConstantColor(Context *rsc, ProgramFragment *pf, 13387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float r, float g, float b, float a) { 13487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(pf); 135383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pf->setConstantColor(rsc, r, g, b, a); 1366445e5210c6d7f8689e94be9026153d017c9545bJason Sams} 1376445e5210c6d7f8689e94be9026153d017c9545bJason Sams 138709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrVpGetProjectionMatrix(Context *rsc, rsc_Matrix *m) { 13960709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->getProjectionMatrix(rsc, m); 14095333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk} 14195333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk 142aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 143aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing 144aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 145aeb094b520d8ea49b74129927578f18f758c873eJason Sams 146aeb094b520d8ea49b74129927578f18f758c873eJason Sams 147709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawPath(Context *rsc, Path *sm) { 1480ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams // Never shipped in a working state 1499e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 1509e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 151709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawMesh(Context *rsc, Mesh *sm) { 15287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 153aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 154aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 155aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 156aeb094b520d8ea49b74129927578f18f758c873eJason Sams sm->render(rsc); 157aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 158aeb094b520d8ea49b74129927578f18f758c873eJason Sams 159709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawMeshPrimitive(Context *rsc, Mesh *sm, uint32_t primIndex) { 16087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 161aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 162aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 163aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 1644e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitive(rsc, primIndex); 1654e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 1664e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 167709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawMeshPrimitiveRange(Context *rsc, Mesh *sm, uint32_t primIndex, 16887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams uint32_t start, uint32_t len) { 16987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 1704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (!rsc->setupCheck()) { 1714e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1724e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1734e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitiveRange(rsc, primIndex, start, len); 174aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 175aeb094b520d8ea49b74129927578f18f758c873eJason Sams 176709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrMeshComputeBoundingBox(Context *rsc, Mesh *sm, 17787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float *minX, float *minY, float *minZ, 17887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float *maxX, float *maxY, float *maxZ) { 17987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 180e3150cfb3edb028407669e4a65e087eae77e718cJason Sams sm->computeBBox(rsc); 181ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minX = sm->mBBoxMin[0]; 182ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minY = sm->mBBoxMin[1]; 183ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minZ = sm->mBBoxMin[2]; 184ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxX = sm->mBBoxMax[0]; 185ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxY = sm->mBBoxMax[1]; 186ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxZ = sm->mBBoxMax[2]; 187ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 188ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 189aeb094b520d8ea49b74129927578f18f758c873eJason Sams 190aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 191aeb094b520d8ea49b74129927578f18f758c873eJason Sams// 192aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 193aeb094b520d8ea49b74129927578f18f758c873eJason Sams 194aeb094b520d8ea49b74129927578f18f758c873eJason Sams 195709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrColor(Context *rsc, float r, float g, float b, float a) { 19687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams ProgramFragment *pf = rsc->getProgramFragment(); 197383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pf->setConstantColor(rsc, r, g, b, a); 198aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 199aeb094b520d8ea49b74129927578f18f758c873eJason Sams 200709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrPrepareClear(Context *rsc) { 201c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk rsc->mFBOCache.setup(rsc); 202889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk rsc->setupProgramStore(); 203aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 204aeb094b520d8ea49b74129927578f18f758c873eJason Sams 205709a0978ae141198018ca9769f8d96292a8928e6Jason Samsuint32_t rsrGetWidth(Context *rsc) { 206aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getWidth(); 207aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 208aeb094b520d8ea49b74129927578f18f758c873eJason Sams 209709a0978ae141198018ca9769f8d96292a8928e6Jason Samsuint32_t rsrGetHeight(Context *rsc) { 210aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getHeight(); 211aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 212aeb094b520d8ea49b74129927578f18f758c873eJason Sams 213709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawTextAlloc(Context *rsc, Allocation *a, int x, int y) { 21461a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a); 21561656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams size_t allocSize = a->getType()->getPackedSizeBytes(); 21609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.renderText(text, allocSize, x, y); 21761a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams rsc->mHal.funcs.allocation.unlock1D(rsc, a); 218d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 219d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 220709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawText(Context *rsc, const char *text, int x, int y) { 22109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk size_t textLen = strlen(text); 22209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.renderText(text, textLen, x, y); 22309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 22409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 22587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SetMetrics(Font::Rect *metrics, 22687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 227afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (left) { 22809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *left = metrics->left; 22909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 230afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (right) { 23109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *right = metrics->right; 23209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 233afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (top) { 23409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *top = metrics->top; 23509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 236afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (bottom) { 23709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *bottom = metrics->bottom; 23809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 23909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 24009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 241709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrMeasureTextAlloc(Context *rsc, Allocation *a, 24287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 24387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(a); 24461a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a); 24561656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams size_t textLen = a->getType()->getPackedSizeBytes(); 24609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk Font::Rect metrics; 24709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.measureText(text, textLen, &metrics); 24887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams SetMetrics(&metrics, left, right, top, bottom); 24961a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams rsc->mHal.funcs.allocation.unlock1D(rsc, a); 25009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 25109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 252709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrMeasureText(Context *rsc, const char *text, 25387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 25409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk size_t textLen = strlen(text); 25509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk Font::Rect metrics; 25609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.measureText(text, textLen, &metrics); 25787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams SetMetrics(&metrics, left, right, top, bottom); 258d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 259d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 260709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindFont(Context *rsc, Font *font) { 261605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ(font); 262d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk rsi_ContextBindFont(rsc, font); 263d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 264aeb094b520d8ea49b74129927578f18f758c873eJason Sams 265709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrFontColor(Context *rsc, float r, float g, float b, float a) { 2669fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk rsc->mStateFont.setFontColor(r, g, b, a); 2679fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk} 2689fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk 2697974fc03e11f3a8dd40f794f3b33b4889483090cRahul Chaudhry} // namespace renderscript 2707974fc03e11f3a8dd40f794f3b33b4889483090cRahul Chaudhry} // namespace android 271