mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Utilities for creating texture backed SkImages. (#2829)
This commit is contained in:
parent
f5c907d663
commit
2b18a40f0b
@ -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 = [
|
||||
|
||||
28
flow/open_gl.h
Normal file
28
flow/open_gl.h
Normal file
@ -0,0 +1,28 @@
|
||||
// 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_
|
||||
92
flow/texture_image.cc
Normal file
92
flow/texture_image.cc
Normal file
@ -0,0 +1,92 @@
|
||||
// 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
|
||||
33
flow/texture_image.h
Normal file
33
flow/texture_image.h
Normal file
@ -0,0 +1,33 @@
|
||||
// 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_
|
||||
Loading…
x
Reference in New Issue
Block a user