diff options
Diffstat (limited to 'libs/hwui/GlopBuilder.h')
| -rw-r--r-- | libs/hwui/GlopBuilder.h | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/libs/hwui/GlopBuilder.h b/libs/hwui/GlopBuilder.h new file mode 100644 index 0000000..b335a2c --- /dev/null +++ b/libs/hwui/GlopBuilder.h @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef RENDERSTATE_GLOPBUILDER_H +#define RENDERSTATE_GLOPBUILDER_H + +#include "OpenGLRenderer.h" +#include "Program.h" +#include "renderstate/Blend.h" +#include "utils/Macros.h" + +class SkPaint; +class SkShader; + +namespace android { +namespace uirenderer { + +class Caches; +class Matrix4; +class RenderState; +class Texture; +class VertexBuffer; +struct Glop; + +enum class TextureFillFlags { + kNone = 0, + kIsAlphaMaskTexture = 1 << 0, + kForceFilter = 1 << 1, +}; +MAKE_FLAGS_ENUM(TextureFillFlags); + +class GlopBuilder { + PREVENT_COPY_AND_ASSIGN(GlopBuilder); +public: + GlopBuilder(RenderState& renderState, Caches& caches, Glop* outGlop); + + GlopBuilder& setMeshUnitQuad(); + GlopBuilder& setMeshTexturedUnitQuad(const UvMapper* uvMapper); + GlopBuilder& setMeshTexturedUvQuad(const UvMapper* uvMapper, const Rect uvs); + GlopBuilder& setMeshVertexBuffer(const VertexBuffer& vertexBuffer, bool shadowInterp); + GlopBuilder& setMeshIndexedQuads(Vertex* vertexData, int quadCount); + GlopBuilder& setMeshTexturedMesh(TextureVertex* vertexData, int elementCount); // TODO: use indexed quads + GlopBuilder& setMeshColoredTexturedMesh(ColorTextureVertex* vertexData, int elementCount); // TODO: use indexed quads + GlopBuilder& setMeshTexturedIndexedQuads(TextureVertex* vertexData, int elementCount); // TODO: take quadCount + GlopBuilder& setMeshPatchQuads(const Patch& patch); + + GlopBuilder& setFillPaint(const SkPaint& paint, float alphaScale); + GlopBuilder& setFillTexturePaint(Texture& texture, int textureFillFlags, + const SkPaint* paint, float alphaScale); + GlopBuilder& setFillPathTexturePaint(PathTexture& texture, + const SkPaint& paint, float alphaScale); + GlopBuilder& setFillShadowTexturePaint(ShadowTexture& texture, int shadowColor, + const SkPaint& paint, float alphaScale); + GlopBuilder& setFillBlack(); + GlopBuilder& setFillClear(); + GlopBuilder& setFillLayer(Texture& texture, const SkColorFilter* colorFilter, + float alpha, SkXfermode::Mode mode, Blend::ModeOrderSwap modeUsage); + GlopBuilder& setFillTextureLayer(Layer& layer, float alpha); + + GlopBuilder& setTransform(const Matrix4& ortho, const Matrix4& transform, bool fudgingOffset); + + GlopBuilder& setModelViewMapUnitToRect(const Rect destination); + GlopBuilder& setModelViewMapUnitToRectSnap(const Rect destination); + GlopBuilder& setModelViewMapUnitToRectOptionalSnap(bool snap, const Rect& destination) { + if (snap) { + return setModelViewMapUnitToRectSnap(destination); + } else { + return setModelViewMapUnitToRect(destination); + } + } + GlopBuilder& setModelViewOffsetRect(float offsetX, float offsetY, const Rect source); + GlopBuilder& setModelViewOffsetRectSnap(float offsetX, float offsetY, const Rect source); + GlopBuilder& setModelViewOffsetRectOptionalSnap(bool snap, + float offsetX, float offsetY, const Rect& source) { + if (snap) { + return setModelViewOffsetRectSnap(offsetX, offsetY, source); + } else { + return setModelViewOffsetRect(offsetX, offsetY, source); + } + } + + GlopBuilder& setRoundRectClipState(const RoundRectClipState* roundRectClipState); + + void build(); +private: + void setFill(int color, float alphaScale, + SkXfermode::Mode mode, Blend::ModeOrderSwap modeUsage, + const SkShader* shader, const SkColorFilter* colorFilter); + + enum StageFlags { + kInitialStage = 0, + kMeshStage = 1 << 0, + kTransformStage = 1 << 1, + kModelViewStage = 1 << 2, + kFillStage = 1 << 3, + kRoundRectClipStage = 1 << 4, + kAllStages = kMeshStage | kFillStage | kTransformStage | kModelViewStage | kRoundRectClipStage, + } mStageFlags; + + ProgramDescription mDescription; + RenderState& mRenderState; + Caches& mCaches; + const SkShader* mShader; + Glop* mOutGlop; +}; + +} /* namespace uirenderer */ +} /* namespace android */ + +#endif // RENDERSTATE_GLOPBUILDER_H |
