OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include <functional> | 8 #include <functional> |
9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
10 #include "SkData.h" | 10 #include "SkData.h" |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 gpu->deleteTestingOnlyBackendTexture(texHandle); | 150 gpu->deleteTestingOnlyBackendTexture(texHandle); |
151 } | 151 } |
152 #endif | 152 #endif |
153 | 153 |
154 static void test_canvas_peek(skiatest::Reporter* reporter, | 154 static void test_canvas_peek(skiatest::Reporter* reporter, |
155 SkSurface* surface, | 155 SkSurface* surface, |
156 const SkImageInfo& requestInfo, | 156 const SkImageInfo& requestInfo, |
157 bool expectPeekSuccess) { | 157 bool expectPeekSuccess) { |
158 const SkColor color = SK_ColorRED; | 158 const SkColor color = SK_ColorRED; |
159 const SkPMColor pmcolor = SkPreMultiplyColor(color); | 159 const SkPMColor pmcolor = SkPreMultiplyColor(color); |
160 SkImageInfo info; | |
161 size_t rowBytes; | |
162 surface->getCanvas()->clear(color); | 160 surface->getCanvas()->clear(color); |
163 | 161 |
164 const void* addr = surface->getCanvas()->peekPixels(&info, &rowBytes); | 162 SkPixmap pmap; |
165 bool success = SkToBool(addr); | 163 bool success = surface->getCanvas()->peekPixels(&pmap); |
166 REPORTER_ASSERT(reporter, expectPeekSuccess == success); | 164 REPORTER_ASSERT(reporter, expectPeekSuccess == success); |
167 | 165 |
168 SkImageInfo info2; | 166 SkPixmap pmap2; |
169 size_t rb2; | 167 const void* addr2 = surface->peekPixels(&pmap2) ? pmap2.addr() : nullptr; |
170 const void* addr2 = surface->peekPixels(&info2, &rb2); | |
171 | 168 |
172 if (success) { | 169 if (success) { |
173 REPORTER_ASSERT(reporter, requestInfo == info); | 170 REPORTER_ASSERT(reporter, requestInfo == pmap.info()); |
174 REPORTER_ASSERT(reporter, requestInfo.minRowBytes() <= rowBytes); | 171 REPORTER_ASSERT(reporter, requestInfo.minRowBytes() <= pmap.rowBytes()); |
175 REPORTER_ASSERT(reporter, pmcolor == *(const SkPMColor*)addr); | 172 REPORTER_ASSERT(reporter, pmcolor == *pmap.addr32()); |
176 | 173 |
177 REPORTER_ASSERT(reporter, addr2 == addr); | 174 REPORTER_ASSERT(reporter, pmap.addr() == pmap2.addr()); |
178 REPORTER_ASSERT(reporter, info2 == info); | 175 REPORTER_ASSERT(reporter, pmap.info() == pmap2.info()); |
179 REPORTER_ASSERT(reporter, rb2 == rowBytes); | 176 REPORTER_ASSERT(reporter, pmap.rowBytes() == pmap2.rowBytes()); |
180 } else { | 177 } else { |
181 REPORTER_ASSERT(reporter, nullptr == addr2); | 178 REPORTER_ASSERT(reporter, nullptr == addr2); |
182 } | 179 } |
183 } | 180 } |
184 DEF_TEST(SurfaceCanvasPeek, reporter) { | 181 DEF_TEST(SurfaceCanvasPeek, reporter) { |
185 for (auto& surface_func : { &create_surface, &create_direct_surface }) { | 182 for (auto& surface_func : { &create_surface, &create_direct_surface }) { |
186 SkImageInfo requestInfo; | 183 SkImageInfo requestInfo; |
187 SkAutoTUnref<SkSurface> surface(surface_func(kPremul_SkAlphaType, &reque
stInfo)); | 184 SkAutoTUnref<SkSurface> surface(surface_func(kPremul_SkAlphaType, &reque
stInfo)); |
188 test_canvas_peek(reporter, surface, requestInfo, true); | 185 test_canvas_peek(reporter, surface, requestInfo, true); |
189 } | 186 } |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 } | 377 } |
381 | 378 |
382 DEF_TEST(UniqueImageSnapshot, reporter) { | 379 DEF_TEST(UniqueImageSnapshot, reporter) { |
383 auto getImageBackingStore = [reporter](SkImage* image) { | 380 auto getImageBackingStore = [reporter](SkImage* image) { |
384 SkPixmap pm; | 381 SkPixmap pm; |
385 bool success = image->peekPixels(&pm); | 382 bool success = image->peekPixels(&pm); |
386 REPORTER_ASSERT(reporter, success); | 383 REPORTER_ASSERT(reporter, success); |
387 return reinterpret_cast<intptr_t>(pm.addr()); | 384 return reinterpret_cast<intptr_t>(pm.addr()); |
388 }; | 385 }; |
389 auto getSufaceBackingStore = [reporter](SkSurface* surface) { | 386 auto getSufaceBackingStore = [reporter](SkSurface* surface) { |
390 SkImageInfo info; | 387 SkPixmap pmap; |
391 size_t rowBytes; | 388 const void* pixels = surface->getCanvas()->peekPixels(&pmap) ? pmap.addr
() : nullptr; |
392 const void* pixels = surface->getCanvas()->peekPixels(&info, &rowBytes); | |
393 REPORTER_ASSERT(reporter, pixels); | 389 REPORTER_ASSERT(reporter, pixels); |
394 return reinterpret_cast<intptr_t>(pixels); | 390 return reinterpret_cast<intptr_t>(pixels); |
395 }; | 391 }; |
396 | 392 |
397 SkAutoTUnref<SkSurface> surface(create_surface()); | 393 SkAutoTUnref<SkSurface> surface(create_surface()); |
398 test_unique_image_snap(reporter, surface, false, getImageBackingStore, getSu
faceBackingStore); | 394 test_unique_image_snap(reporter, surface, false, getImageBackingStore, getSu
faceBackingStore); |
399 surface.reset(create_direct_surface()); | 395 surface.reset(create_direct_surface()); |
400 test_unique_image_snap(reporter, surface, true, getImageBackingStore, getSuf
aceBackingStore); | 396 test_unique_image_snap(reporter, surface, true, getImageBackingStore, getSuf
aceBackingStore); |
401 } | 397 } |
402 | 398 |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
778 SkAutoTUnref<SkSurface> surface( | 774 SkAutoTUnref<SkSurface> surface( |
779 surface_func(context, kPremul_SkAlphaType, nullptr)); | 775 surface_func(context, kPremul_SkAlphaType, nullptr)); |
780 test_func(reporter, surface, mode); | 776 test_func(reporter, surface, mode); |
781 } | 777 } |
782 } | 778 } |
783 } | 779 } |
784 } | 780 } |
785 #endif | 781 #endif |
786 | 782 |
787 static void check_rowbytes_remain_consistent(SkSurface* surface, skiatest::Repor
ter* reporter) { | 783 static void check_rowbytes_remain_consistent(SkSurface* surface, skiatest::Repor
ter* reporter) { |
788 SkImageInfo info; | 784 SkPixmap surfacePM; |
789 size_t rowBytes; | 785 REPORTER_ASSERT(reporter, surface->peekPixels(&surfacePM)); |
790 REPORTER_ASSERT(reporter, surface->peekPixels(&info, &rowBytes)); | |
791 | 786 |
792 SkAutoTUnref<SkImage> image(surface->newImageSnapshot()); | 787 SkAutoTUnref<SkImage> image(surface->newImageSnapshot()); |
793 SkImageInfo im_info; | 788 SkPixmap pm; |
794 size_t im_rowbytes; | 789 REPORTER_ASSERT(reporter, image->peekPixels(&pm)); |
795 REPORTER_ASSERT(reporter, image->peekPixels(&im_info, &im_rowbytes)); | |
796 | 790 |
797 REPORTER_ASSERT(reporter, rowBytes == im_rowbytes); | 791 REPORTER_ASSERT(reporter, surfacePM.rowBytes() == pm.rowBytes()); |
798 | 792 |
799 // trigger a copy-on-write | 793 // trigger a copy-on-write |
800 surface->getCanvas()->drawPaint(SkPaint()); | 794 surface->getCanvas()->drawPaint(SkPaint()); |
801 SkAutoTUnref<SkImage> image2(surface->newImageSnapshot()); | 795 SkAutoTUnref<SkImage> image2(surface->newImageSnapshot()); |
802 REPORTER_ASSERT(reporter, image->uniqueID() != image2->uniqueID()); | 796 REPORTER_ASSERT(reporter, image->uniqueID() != image2->uniqueID()); |
803 | 797 |
804 SkImageInfo im_info2; | 798 SkPixmap pm2; |
805 size_t im_rowbytes2; | 799 REPORTER_ASSERT(reporter, image2->peekPixels(&pm2)); |
806 REPORTER_ASSERT(reporter, image2->peekPixels(&im_info2, &im_rowbytes2)); | 800 REPORTER_ASSERT(reporter, pm2.rowBytes() == pm.rowBytes()); |
807 | |
808 REPORTER_ASSERT(reporter, im_rowbytes2 == im_rowbytes); | |
809 } | 801 } |
810 | 802 |
811 DEF_TEST(surface_rowbytes, reporter) { | 803 DEF_TEST(surface_rowbytes, reporter) { |
812 const SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100); | 804 const SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100); |
813 | 805 |
814 SkAutoTUnref<SkSurface> surf0(SkSurface::NewRaster(info)); | 806 SkAutoTUnref<SkSurface> surf0(SkSurface::NewRaster(info)); |
815 check_rowbytes_remain_consistent(surf0, reporter); | 807 check_rowbytes_remain_consistent(surf0, reporter); |
816 | 808 |
817 // specify a larger rowbytes | 809 // specify a larger rowbytes |
818 SkAutoTUnref<SkSurface> surf1(SkSurface::NewRaster(info, 500, nullptr)); | 810 SkAutoTUnref<SkSurface> surf1(SkSurface::NewRaster(info, 500, nullptr)); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
898 desc.fHeight = kHeight; | 890 desc.fHeight = kHeight; |
899 desc.fFlags = kRenderTarget_GrBackendTextureFlag; | 891 desc.fFlags = kRenderTarget_GrBackendTextureFlag; |
900 desc.fTextureHandle = textureObject; | 892 desc.fTextureHandle = textureObject; |
901 | 893 |
902 SkSurface* surface = SkSurface::NewFromBackendTexture(context, desc, nul
lptr); | 894 SkSurface* surface = SkSurface::NewFromBackendTexture(context, desc, nul
lptr); |
903 test_surface_clear(reporter, surface, grSurfaceGetter, 0xABABABAB); | 895 test_surface_clear(reporter, surface, grSurfaceGetter, 0xABABABAB); |
904 context->getGpu()->deleteTestingOnlyBackendTexture(textureObject); | 896 context->getGpu()->deleteTestingOnlyBackendTexture(textureObject); |
905 } | 897 } |
906 } | 898 } |
907 #endif | 899 #endif |
OLD | NEW |