OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "gm.h" | 8 #include "gm.h" |
9 #include "SkData.h" | 9 #include "SkData.h" |
10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
293 show_scaled_pixels(canvas, image); | 293 show_scaled_pixels(canvas, image); |
294 } | 294 } |
295 canvas->translate(0, 120); | 295 canvas->translate(0, 120); |
296 } | 296 } |
297 } | 297 } |
298 | 298 |
299 private: | 299 private: |
300 typedef skiagm::GM INHERITED; | 300 typedef skiagm::GM INHERITED; |
301 }; | 301 }; |
302 DEF_GM( return new ScalePixelsGM; ) | 302 DEF_GM( return new ScalePixelsGM; ) |
303 | |
304 //////////////////////////////////////////////////////////////////////////////// /////////////////// | |
305 | |
306 #include "SkImageGenerator.h" | |
307 | |
308 static SkImageInfo make_info(SkImage* img) { | |
309 return SkImageInfo::MakeN32Premul(img->width(), img->height()); | |
310 } | |
311 | |
312 class ImageGeneratorFromImage : public SkImageGenerator { | |
313 public: | |
314 ImageGeneratorFromImage(SkImage* img) : INHERITED(make_info(img)), fImg(SkRe f(img)) {} | |
315 | |
316 protected: | |
317 bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkP MColor ctable[], | |
318 int* ctableCount) override { | |
319 SkBitmap bm; | |
320 bm.installPixels(info, pixels, rowBytes); | |
321 bm.eraseColor(0); | |
322 SkCanvas canvas(bm); | |
323 canvas.drawImage(fImg, 0, 0, nullptr); | |
324 return true; | |
325 } | |
326 | |
327 private: | |
328 SkAutoTUnref<SkImage> fImg; | |
329 | |
330 typedef SkImageGenerator INHERITED; | |
331 }; | |
332 | |
333 static SkImageGenerator* gen_raster(const SkImageInfo& info, GrContext*) { | |
334 SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info)); | |
335 draw_contents(surface->getCanvas()); | |
336 SkAutoTUnref<SkImage> img(surface->newImageSnapshot()); | |
337 return new ImageGeneratorFromImage(img); | |
338 } | |
339 | |
340 static SkImageGenerator* gen_picture(const SkImageInfo& info, GrContext*) { | |
341 SkPictureRecorder recorder; | |
342 draw_contents(recorder.beginRecording(SkRect::MakeIWH(info.width(), info.hei ght()))); | |
343 SkAutoTUnref<SkPicture> pict(recorder.endRecording()); | |
344 return SkImageGenerator::NewFromPicture(info.dimensions(), pict, nullptr, nu llptr); | |
345 } | |
346 | |
347 static SkImageGenerator* gen_png(const SkImageInfo& info, GrContext*) { | |
348 SkAutoTUnref<SkImage> image(make_raster(info, nullptr)); | |
349 SkAutoTUnref<SkData> data(image->encode(SkImageEncoder::kPNG_Type, 100)); | |
350 return SkImageGenerator::NewFromEncoded(data); | |
351 } | |
352 | |
353 static SkImageGenerator* gen_jpg(const SkImageInfo& info, GrContext*) { | |
msarett
2015/11/30 23:00:32
I'm not sure this is working right. JPEGs must be
reed1
2015/12/01 03:31:47
You're right. The test will be changed to present
| |
354 SkAutoTUnref<SkImage> image(make_raster(info, nullptr)); | |
355 SkAutoTUnref<SkData> data(image->encode(SkImageEncoder::kJPEG_Type, 100)); | |
356 return SkImageGenerator::NewFromEncoded(data); | |
357 } | |
358 | |
359 typedef SkImageGenerator* (*GeneratorMakerProc)(const SkImageInfo&, GrContext*); | |
360 | |
361 static void show_scaled_generator(SkCanvas* canvas, SkImageGenerator* gen) { | |
362 const SkImageInfo genInfo = gen->getInfo(); | |
363 | |
364 SkAutoCanvasRestore acr(canvas, true); | |
365 | |
366 SkBitmap bm; | |
367 bm.allocPixels(genInfo); | |
368 if (gen->getPixels(bm.info(), bm.getPixels(), bm.rowBytes())) { | |
369 canvas->drawBitmap(bm, 0, 0, nullptr); | |
370 } | |
371 canvas->translate(110, 0); | |
372 | |
373 const float scales[] = { 0.75f, 0.5f, 0.25f }; | |
374 for (auto scale : scales) { | |
375 SkImageGenerator::SupportedSizes sizes; | |
376 if (gen->computeScaledDimensions(scale, &sizes)) { | |
377 const SkImageInfo info = SkImageInfo::MakeN32Premul(sizes.fSizes[0]. width(), | |
scroggo
2015/12/02 15:04:44
Why not draw both sizes?
reed1
2015/12/02 21:37:05
Could, but I thought the key here was to see the "
| |
378 sizes.fSizes[0]. height()); | |
379 bm.allocPixels(info); | |
380 SkPixmap pmap; | |
381 bm.peekPixels(&pmap); | |
382 if (gen->generateScaledPixels(pmap)) { | |
383 canvas->drawBitmap(bm, 0, SkIntToScalar(genInfo.height() - info. height())/2); | |
384 } | |
385 } | |
386 canvas->translate(100, 0); | |
387 } | |
388 } | |
389 | |
390 class ScaleGeneratorGM : public skiagm::GM { | |
391 public: | |
392 ScaleGeneratorGM() {} | |
393 | |
394 protected: | |
395 SkString onShortName() override { | |
396 return SkString("scale-generator"); | |
397 } | |
398 | |
399 SkISize onISize() override { | |
400 return SkISize::Make(960, 1200); | |
401 } | |
402 | |
403 void onDraw(SkCanvas* canvas) override { | |
404 const SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100); | |
msarett
2015/11/30 23:00:32
SkCodec fails if we attempt to decode a jpeg to kP
scroggo
2015/12/02 15:04:44
I've gone back and forth on whether that's the rig
reed1
2015/12/02 21:37:05
I think encode+premul -> jpeg can fail (or not, yo
| |
405 | |
406 const GeneratorMakerProc procs[] = { | |
407 gen_raster, gen_picture, gen_png, gen_jpg, | |
408 }; | |
409 for (auto& proc : procs) { | |
410 SkAutoTDelete<SkImageGenerator> gen(proc(info, canvas->getGrContext( ))); | |
411 if (gen) { | |
412 show_scaled_generator(canvas, gen); | |
413 } | |
414 canvas->translate(0, 120); | |
415 } | |
416 } | |
417 | |
418 private: | |
419 typedef skiagm::GM INHERITED; | |
420 }; | |
421 DEF_GM( return new ScaleGeneratorGM; ) | |
OLD | NEW |