1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "skia_data.h"
17
18 #include "include/core/SkImageInfo.h"
19 #include "utils/data.h"
20 #include "utils/log.h"
21
22 #ifdef ROSEN_OHOS
23 #include "src/core/SkReadBuffer.h"
24 #include "src/core/SkWriteBuffer.h"
25 #endif
26
27 namespace OHOS {
28 namespace Rosen {
29 namespace Drawing {
SkiaData()30 SkiaData::SkiaData() noexcept : skData_(nullptr) {}
31
BuildFromMalloc(const void * data,size_t length)32 bool SkiaData::BuildFromMalloc(const void* data, size_t length)
33 {
34 skData_ = SkData::MakeFromMalloc(data, length);
35 return skData_ != nullptr;
36 }
37
BuildFromOHNativeBuffer(OH_NativeBuffer * nativeBuffer,size_t length)38 bool SkiaData::BuildFromOHNativeBuffer(OH_NativeBuffer* nativeBuffer, size_t length)
39 {
40 skData_ = SkData::MakeFromOHNativeBuffer(nativeBuffer, length);
41 return skData_ != nullptr;
42 }
43
BuildWithCopy(const void * data,size_t length)44 bool SkiaData::BuildWithCopy(const void* data, size_t length)
45 {
46 skData_ = SkData::MakeWithCopy(data, length);
47 return skData_ != nullptr;
48 }
49
BuildWithProc(const void * ptr,size_t length,DataReleaseProc proc,void * ctx)50 bool SkiaData::BuildWithProc(const void* ptr, size_t length, DataReleaseProc proc, void* ctx)
51 {
52 skData_ = SkData::MakeWithProc(ptr, length, proc, ctx);
53 return skData_ != nullptr;
54 }
55
BuildWithoutCopy(const void * data,size_t length)56 bool SkiaData::BuildWithoutCopy(const void* data, size_t length)
57 {
58 skData_ = SkData::MakeWithoutCopy(data, length);
59 return skData_ != nullptr;
60 }
61
BuildUninitialized(size_t length)62 bool SkiaData::BuildUninitialized(size_t length)
63 {
64 skData_ = SkData::MakeUninitialized(length);
65 return skData_ != nullptr;
66 }
67
BuildEmpty()68 bool SkiaData::BuildEmpty()
69 {
70 skData_ = SkData::MakeEmpty();
71 return skData_ != nullptr;
72 }
73
GetSize() const74 size_t SkiaData::GetSize() const
75 {
76 return (skData_ == nullptr) ? 0 : skData_->size();
77 }
78
GetData() const79 const void* SkiaData::GetData() const
80 {
81 return (skData_ == nullptr) ? nullptr : skData_->data();
82 }
83
MakeFromFileName(const char path[])84 std::shared_ptr<Data> SkiaData::MakeFromFileName(const char path[])
85 {
86 sk_sp<SkData> skData = SkData::MakeFromFileName(path);
87 if (!skData) {
88 LOGD("SkiaData::MakeFromFileName, skData is nullptr!");
89 return nullptr;
90 }
91 std::shared_ptr<Data> data = std::make_shared<Data>();
92 data->GetImpl<SkiaData>()->SetSkData(skData);
93 return data;
94 }
95
WritableData()96 void* SkiaData::WritableData()
97 {
98 return (skData_ == nullptr) ? nullptr : skData_->writable_data();
99 }
100
GetSkData() const101 sk_sp<SkData> SkiaData::GetSkData() const
102 {
103 return skData_;
104 }
105
SetSkData(const sk_sp<SkData> & data)106 void SkiaData::SetSkData(const sk_sp<SkData>& data)
107 {
108 skData_ = data;
109 }
110
Serialize() const111 std::shared_ptr<Data> SkiaData::Serialize() const
112 {
113 #ifdef ROSEN_OHOS
114 if (skData_ == nullptr) {
115 LOGD("SkiaData::Serialize, skData_ is nullptr!");
116 return nullptr;
117 }
118
119 SkBinaryWriteBuffer writer;
120 writer.writeDataAsByteArray(skData_.get());
121
122 size_t length = writer.bytesWritten();
123 std::shared_ptr<Data> data = std::make_shared<Data>();
124 data->BuildUninitialized(length);
125 writer.writeToMemory(data->WritableData());
126 return data;
127 #else
128 return nullptr;
129 #endif
130 }
131 } // Drawing
132 } // Rosen
133 } // OHOS
134