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