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 25aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "utils/Timers.h" 26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdVertexArray.h" 27a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdShaderCache.h" 28a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdCore.h" 29aeb094b520d8ea49b74129927578f18f758c873eJason Sams 30aeb094b520d8ea49b74129927578f18f758c873eJason Sams#define GL_GLEXT_PROTOTYPES 31aeb094b520d8ea49b74129927578f18f758c873eJason Sams 32aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/gl.h> 33aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/glext.h> 34aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2.h> 35aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2ext.h> 36aeb094b520d8ea49b74129927578f18f758c873eJason Sams 37aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <time.h> 38aeb094b520d8ea49b74129927578f18f758c873eJason Sams 39aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android; 40aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android::renderscript; 41aeb094b520d8ea49b74129927578f18f758c873eJason Sams 4287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace android { 4387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace renderscript { 44aeb094b520d8ea49b74129927578f18f758c873eJason Sams 45aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 46aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Context 47aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 48aeb094b520d8ea49b74129927578f18f758c873eJason Sams 49709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindTexture(Context *rsc, ProgramFragment *pf, uint32_t slot, Allocation *a) { 5087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ_OR_NULL(a); 5187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(pf); 5287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams pf->bindTexture(rsc, slot, a); 53aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 54aeb094b520d8ea49b74129927578f18f758c873eJason Sams 55709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindConstant(Context *rsc, ProgramFragment *pf, uint32_t slot, Allocation *a) { 56a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk CHECK_OBJ_OR_NULL(a); 57a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk CHECK_OBJ(pf); 58a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk pf->bindAllocation(rsc, a, slot); 59a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk} 60a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk 61709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindConstant(Context *rsc, ProgramVertex *pv, uint32_t slot, Allocation *a) { 62a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk CHECK_OBJ_OR_NULL(a); 638e6bde735d3c0024c36beff668e1588803657357Alex Sakhartchouk CHECK_OBJ(pv); 648e6bde735d3c0024c36beff668e1588803657357Alex Sakhartchouk pv->bindAllocation(rsc, a, slot); 65a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk} 66a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk 67709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindSampler(Context *rsc, ProgramFragment *pf, uint32_t slot, Sampler *s) { 68605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ_OR_NULL(vs); 69605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ(vpf); 7087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams pf->bindSampler(rsc, slot, s); 71aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 72aeb094b520d8ea49b74129927578f18f758c873eJason Sams 73709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindProgramStore(Context *rsc, ProgramStore *ps) { 7487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ_OR_NULL(ps); 7587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramStore(ps); 76aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 77aeb094b520d8ea49b74129927578f18f758c873eJason Sams 78709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindProgramFragment(Context *rsc, ProgramFragment *pf) { 79605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ_OR_NULL(pf); 8087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramFragment(pf); 81aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 82aeb094b520d8ea49b74129927578f18f758c873eJason Sams 83709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindProgramVertex(Context *rsc, ProgramVertex *pv) { 84605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ_OR_NULL(pv); 8587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramVertex(pv); 86aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 87aeb094b520d8ea49b74129927578f18f758c873eJason Sams 88709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindProgramRaster(Context *rsc, ProgramRaster *pr) { 8987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ_OR_NULL(pr); 9087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->setProgramRaster(pr); 91aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 92aeb094b520d8ea49b74129927578f18f758c873eJason Sams 93709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindFrameBufferObjectColorTarget(Context *rsc, Allocation *a, uint32_t slot) { 947d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk CHECK_OBJ(va); 9587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->mFBOCache.bindColorTarget(rsc, a, slot); 96a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 977d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 987d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 99709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindFrameBufferObjectDepthTarget(Context *rsc, Allocation *a) { 1007d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk CHECK_OBJ(va); 10187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams rsc->mFBOCache.bindDepthTarget(rsc, a); 102a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 1037d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 1047d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 105709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrClearFrameBufferObjectColorTarget(Context *rsc, uint32_t slot) { 1067d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk rsc->mFBOCache.bindColorTarget(rsc, NULL, slot); 107a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 1087d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 1097d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 110709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrClearFrameBufferObjectDepthTarget(Context *rsc) { 1117d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk rsc->mFBOCache.bindDepthTarget(rsc, NULL); 112a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 1137d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 1147d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 115709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrClearFrameBufferObjectTargets(Context *rsc) { 1167d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk rsc->mFBOCache.resetAll(rsc); 117a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk rsc->mStateVertex.updateSize(rsc); 1187d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk} 1197d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk 120aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 121aeb094b520d8ea49b74129927578f18f758c873eJason Sams// VP 122aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 123aeb094b520d8ea49b74129927578f18f758c873eJason Sams 124709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrVpLoadProjectionMatrix(Context *rsc, const rsc_Matrix *m) { 12560709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->setProjectionMatrix(rsc, m); 126a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller} 127a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller 128709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrVpLoadModelMatrix(Context *rsc, const rsc_Matrix *m) { 12960709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->setModelviewMatrix(rsc, m); 130aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 131aeb094b520d8ea49b74129927578f18f758c873eJason Sams 132709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrVpLoadTextureMatrix(Context *rsc, const rsc_Matrix *m) { 13360709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->setTextureMatrix(rsc, m); 134aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 135aeb094b520d8ea49b74129927578f18f758c873eJason Sams 136709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrPfConstantColor(Context *rsc, ProgramFragment *pf, 13787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float r, float g, float b, float a) { 13887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(pf); 139383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pf->setConstantColor(rsc, r, g, b, a); 1406445e5210c6d7f8689e94be9026153d017c9545bJason Sams} 1416445e5210c6d7f8689e94be9026153d017c9545bJason Sams 142709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrVpGetProjectionMatrix(Context *rsc, rsc_Matrix *m) { 14360709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams rsc->getProgramVertex()->getProjectionMatrix(rsc, m); 14495333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk} 14595333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk 146aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 147aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing 148aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 149aeb094b520d8ea49b74129927578f18f758c873eJason Sams 150aeb094b520d8ea49b74129927578f18f758c873eJason Sams 151709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawPath(Context *rsc, Path *sm) { 1529e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams CHECK_OBJ(sm); 1539e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams if (!rsc->setupCheck()) { 1549e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams return; 1559e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams } 1569e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams sm->render(rsc); 1579e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams} 1589e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams 159709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawMesh(Context *rsc, Mesh *sm) { 16087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 161aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 162aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 163aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 164aeb094b520d8ea49b74129927578f18f758c873eJason Sams sm->render(rsc); 165aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 166aeb094b520d8ea49b74129927578f18f758c873eJason Sams 167709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawMeshPrimitive(Context *rsc, Mesh *sm, uint32_t primIndex) { 16887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 169aeb094b520d8ea49b74129927578f18f758c873eJason Sams if (!rsc->setupCheck()) { 170aeb094b520d8ea49b74129927578f18f758c873eJason Sams return; 171aeb094b520d8ea49b74129927578f18f758c873eJason Sams } 1724e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitive(rsc, primIndex); 1734e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 1744e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 175709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawMeshPrimitiveRange(Context *rsc, Mesh *sm, uint32_t primIndex, 17687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams uint32_t start, uint32_t len) { 17787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 1784e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (!rsc->setupCheck()) { 1794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->renderPrimitiveRange(rsc, primIndex, start, len); 182aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 183aeb094b520d8ea49b74129927578f18f758c873eJason Sams 184709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrMeshComputeBoundingBox(Context *rsc, Mesh *sm, 18587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float *minX, float *minY, float *minZ, 18687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float *maxX, float *maxY, float *maxZ) { 18787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(sm); 188e3150cfb3edb028407669e4a65e087eae77e718cJason Sams sm->computeBBox(rsc); 189ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minX = sm->mBBoxMin[0]; 190ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minY = sm->mBBoxMin[1]; 191ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *minZ = sm->mBBoxMin[2]; 192ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxX = sm->mBBoxMax[0]; 193ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxY = sm->mBBoxMax[1]; 194ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk *maxZ = sm->mBBoxMax[2]; 195ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 196ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 197aeb094b520d8ea49b74129927578f18f758c873eJason Sams 198aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 199aeb094b520d8ea49b74129927578f18f758c873eJason Sams// 200aeb094b520d8ea49b74129927578f18f758c873eJason Sams////////////////////////////////////////////////////////////////////////////// 201aeb094b520d8ea49b74129927578f18f758c873eJason Sams 202aeb094b520d8ea49b74129927578f18f758c873eJason Sams 203709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrColor(Context *rsc, float r, float g, float b, float a) { 20487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams ProgramFragment *pf = rsc->getProgramFragment(); 205383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk pf->setConstantColor(rsc, r, g, b, a); 206aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 207aeb094b520d8ea49b74129927578f18f758c873eJason Sams 208709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrPrepareClear(Context *rsc) { 209c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk rsc->mFBOCache.setup(rsc); 210889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk rsc->setupProgramStore(); 211aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 212aeb094b520d8ea49b74129927578f18f758c873eJason Sams 213709a0978ae141198018ca9769f8d96292a8928e6Jason Samsuint32_t rsrGetWidth(Context *rsc) { 214aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getWidth(); 215aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 216aeb094b520d8ea49b74129927578f18f758c873eJason Sams 217709a0978ae141198018ca9769f8d96292a8928e6Jason Samsuint32_t rsrGetHeight(Context *rsc) { 218aeb094b520d8ea49b74129927578f18f758c873eJason Sams return rsc->getHeight(); 219aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 220aeb094b520d8ea49b74129927578f18f758c873eJason Sams 221709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawTextAlloc(Context *rsc, Allocation *a, int x, int y) { 22261a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a); 22361656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams size_t allocSize = a->getType()->getPackedSizeBytes(); 22409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.renderText(text, allocSize, x, y); 22561a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams rsc->mHal.funcs.allocation.unlock1D(rsc, a); 226d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 227d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 228709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawText(Context *rsc, const char *text, int x, int y) { 22909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk size_t textLen = strlen(text); 23009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.renderText(text, textLen, x, y); 23109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 23209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 23387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SetMetrics(Font::Rect *metrics, 23487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 235afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (left) { 23609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *left = metrics->left; 23709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 238afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (right) { 23909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *right = metrics->right; 24009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 241afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (top) { 24209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *top = metrics->top; 24309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 244afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (bottom) { 24509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk *bottom = metrics->bottom; 24609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk } 24709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 24809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 249709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrMeasureTextAlloc(Context *rsc, Allocation *a, 25087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 25187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams CHECK_OBJ(a); 25261a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a); 25361656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams size_t textLen = a->getType()->getPackedSizeBytes(); 25409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk Font::Rect metrics; 25509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.measureText(text, textLen, &metrics); 25687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams SetMetrics(&metrics, left, right, top, bottom); 25761a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams rsc->mHal.funcs.allocation.unlock1D(rsc, a); 25809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk} 25909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk 260709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrMeasureText(Context *rsc, const char *text, 26187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) { 26209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk size_t textLen = strlen(text); 26309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk Font::Rect metrics; 26409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk rsc->mStateFont.measureText(text, textLen, &metrics); 26587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams SetMetrics(&metrics, left, right, top, bottom); 266d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 267d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 268709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindFont(Context *rsc, Font *font) { 269605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams CHECK_OBJ(font); 270d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk rsi_ContextBindFont(rsc, font); 271d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk} 272aeb094b520d8ea49b74129927578f18f758c873eJason Sams 273709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrFontColor(Context *rsc, float r, float g, float b, float a) { 2749fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk rsc->mStateFont.setFontColor(r, g, b, a); 2759fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk} 2769fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk 277aeb094b520d8ea49b74129927578f18f758c873eJason Sams} 27887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 279