OpenGLRenderer.cpp revision bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#define LOG_TAG "OpenGLRenderer" 18 19#include <stdlib.h> 20#include <stdint.h> 21#include <sys/types.h> 22 23#include <utils/Errors.h> 24#include <utils/Log.h> 25 26#include <GLES2/gl2.h> 27#include <GLES2/gl2ext.h> 28 29#include <SkXfermode.h> 30 31#include "OpenGLRenderer.h" 32#include "Matrix.h" 33 34namespace android { 35 36OpenGLRenderer::OpenGLRenderer() { 37 LOGD("Create OpenGLRenderer"); 38 39 mSnapshot = new Snapshot; 40 mSaveCount = 0; 41} 42 43OpenGLRenderer::~OpenGLRenderer() { 44 LOGD("Destroy OpenGLRenderer"); 45} 46 47void OpenGLRenderer::setViewport(int width, int height) { 48 glViewport(0, 0, width, height); 49 50 mat4 ortho; 51 ortho.loadOrtho(0, width, height, 0, 0, 1); 52 ortho.copyTo(mOrthoMatrix); 53 54 mWidth = width; 55 mHeight = height; 56} 57 58void OpenGLRenderer::prepare() { 59 glDisable(GL_SCISSOR_TEST); 60 61 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 62 glClear(GL_COLOR_BUFFER_BIT); 63 64 glEnable(GL_SCISSOR_TEST); 65 mSnapshot->clipRect.set(0.0f, 0.0f, mWidth, mHeight); 66} 67 68int OpenGLRenderer::getSaveCount() const { 69 return mSaveCount; 70} 71 72int OpenGLRenderer::save(int flags) { 73 return saveSnapshot(); 74} 75 76void OpenGLRenderer::restore() { 77 if (mSaveCount == 0) return; 78 79 if (restoreSnapshot()) { 80 setScissorFromClip(); 81 } 82} 83 84void OpenGLRenderer::restoreToCount(int saveCount) { 85 if (saveCount <= 0 || saveCount > mSaveCount) return; 86 87 bool restoreClip = false; 88 89 while (mSaveCount != saveCount - 1) { 90 restoreClip |= restoreSnapshot(); 91 } 92 93 if (restoreClip) { 94 setScissorFromClip(); 95 } 96} 97 98int OpenGLRenderer::saveSnapshot() { 99 mSnapshot = new Snapshot(mSnapshot); 100 mSaveCount++; 101 return mSaveCount; 102} 103 104bool OpenGLRenderer::restoreSnapshot() { 105 // TODO: handle local transformations 106 bool restoreClip = mSnapshot->flags & Snapshot::kFlagClipSet; 107 108 mSaveCount--; 109 mSnapshot = mSnapshot->previous; 110 111 return restoreClip; 112} 113 114void OpenGLRenderer::setScissorFromClip() { 115 Rect clip = mSnapshot->clipRect; 116 glScissor(clip.left, clip.top, clip.getWidth(), clip.getHeight()); 117} 118 119bool OpenGLRenderer::clipRect(float left, float top, float right, float bottom) { 120 // TODO: take local translate transform into account 121 bool clipped = mSnapshot->clipRect.intersect(left, top, right, bottom); 122 if (clipped) { 123 mSnapshot->flags |= Snapshot::kFlagClipSet; 124 setScissorFromClip(); 125 } 126 return clipped; 127} 128 129void OpenGLRenderer::drawColor(int color, SkXfermode::Mode mode) { 130 LOGD("Drawing color"); 131} 132 133}; // namespace android 134