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