提交 2b18a40f 编写于 作者: C Chinmay Garde 提交者: GitHub

Utilities for creating texture backed SkImages. (#2829)

上级 f5c907d6
......@@ -38,8 +38,11 @@ source_set("flow") {
"layers/shader_mask_layer.h",
"layers/transform_layer.cc",
"layers/transform_layer.h",
"open_gl.h",
"raster_cache.cc",
"raster_cache.h",
"texture_image.cc",
"texture_image.h",
]
deps = [
......
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FLOW_OPEN_GL_H_
#define FLOW_OPEN_GL_H_
#include "build/build_config.h"
#if OS_IOS
#include <OpenGLES/ES2/gl.h>
#elif OS_MACOSX
#include <OpenGL/gl.h>
#elif OS_ANDROID
#include <GLES2/gl2.h>
#else
#error OpenGL headers not found for this platform.
#endif
#endif // FLOW_OPEN_GL_H_
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "flow/texture_image.h"
#include "flow/open_gl.h"
namespace flow {
inline GLint ToGLFormat(TextureImageFormat format) {
switch (format) {
case TextureImageFormat::RGBA:
return GL_RGBA;
case TextureImageFormat::RGB:
return GL_RGB;
case TextureImageFormat::Grey:
return GL_LUMINANCE;
case TextureImageFormat::GreyAlpha:
return GL_LUMINANCE_ALPHA;
}
return GL_NONE;
}
inline GLint ToGLDataFormat(TextureImageDataFormat dataFormat) {
switch (dataFormat) {
case TextureImageDataFormat::UnsignedByte:
return GL_UNSIGNED_BYTE;
case TextureImageDataFormat::UnsignedShort565:
return GL_UNSIGNED_SHORT_5_6_5;
}
return GL_NONE;
}
sk_sp<SkImage> TextureImageCreate(GrContext* context,
TextureImageFormat format,
const SkISize& size,
TextureImageDataFormat dataFormat,
const uint8_t* data) {
GLuint handle = GL_NONE;
// Generate the texture handle.
glGenTextures(1, &handle);
// Bind the texture.
glBindTexture(GL_TEXTURE_2D, handle);
// Specify default texture properties.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Update unpack alignment based on format.
glPixelStorei(GL_UNPACK_ALIGNMENT,
dataFormat == TextureImageDataFormat::UnsignedByte ? 4 : 2);
GLint gl_format = ToGLFormat(format);
// Upload the texture.
glTexImage2D(GL_TEXTURE_2D, // target
0, // level
gl_format, // internal format
size.fWidth, // width
size.fHeight, // height
0, // border
gl_format, // format
ToGLDataFormat(dataFormat), // format
data);
// Clear the binding. We are done.
glBindTexture(GL_TEXTURE_2D, GL_NONE);
// Create an SkImage handle from the texture.
GrBackendTextureDesc desc;
desc.fWidth = size.fWidth;
desc.fHeight = size.fHeight;
desc.fTextureHandle = handle;
if (auto image = SkImage::MakeFromAdoptedTexture(context, desc)) {
// Texture handle was successfully adopted by the SkImage.
return image;
}
// We could not create an SkImage from the texture. Since it could not be
// adopted, delete the handle and return null.
glDeleteTextures(1, &handle);
return nullptr;
}
} // namespace flow
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FLOW_TEXTURE_IMAGE_H_
#define FLOW_TEXTURE_IMAGE_H_
#include "base/macros.h"
#include "third_party/skia/include/core/SkImage.h"
namespace flow {
enum class TextureImageFormat {
Grey,
GreyAlpha,
RGB,
RGBA,
};
enum class TextureImageDataFormat {
UnsignedByte,
UnsignedShort565,
};
sk_sp<SkImage> TextureImageCreate(GrContext* context,
TextureImageFormat format,
const SkISize& size,
TextureImageDataFormat dataFormat,
const uint8_t* data);
} // namespace flow
#endif // FLOW_TEXTURE_IMAGE_H_
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册