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