Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(178)

Side by Side Diff: src/core/SkLinearBitmapPipeline.cpp

Issue 1844713005: Revert of Add unit repeat tiler (Closed) Base URL: https://skia.googlesource.com/skia.git@enhance-bilerp-interface
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/core/SkLinearBitmapPipeline_tile.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 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 "SkLinearBitmapPipeline.h" 8 #include "SkLinearBitmapPipeline.h"
9 9
10 #include "SkPM4f.h" 10 #include "SkPM4f.h"
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 this->bilerpPoint(xs[1], ys[1]); 231 this->bilerpPoint(xs[1], ys[1]);
232 this->bilerpPoint(xs[2], ys[2]); 232 this->bilerpPoint(xs[2], ys[2]);
233 this->bilerpPoint(xs[3], ys[3]); 233 this->bilerpPoint(xs[3], ys[3]);
234 } 234 }
235 235
236 struct Wrapper { 236 struct Wrapper {
237 void pointSpan(Span span) { 237 void pointSpan(Span span) {
238 processor->breakIntoEdges(span); 238 processor->breakIntoEdges(span);
239 } 239 }
240 240
241 void repeatSpan(Span span, int32_t repeatCount) {
242 while (repeatCount --> 0) {
243 processor->pointSpan(span);
244 }
245 }
246
247 BilerpTileStage* processor; 241 BilerpTileStage* processor;
248 }; 242 };
249 243
250 // The span you pass must not be empty. 244 // The span you pass must not be empty.
251 void pointSpan(Span span) override { 245 void pointSpan(Span span) override {
252 SkASSERT(!span.isEmpty()); 246 SkASSERT(!span.isEmpty());
253 247
254 Wrapper wrapper = {this}; 248 Wrapper wrapper = {this};
255 if (!fXStrategy.maybeProcessSpan(span, &wrapper)) { 249 if (!fXStrategy.maybeProcessSpan(span, &wrapper)) {
256 span_fallback(span, this); 250 span_fallback(span, this);
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 break; 357 break;
364 } 358 }
365 }; 359 };
366 360
367 static SkLinearBitmapPipeline::PointProcessorInterface* choose_tiler( 361 static SkLinearBitmapPipeline::PointProcessorInterface* choose_tiler(
368 SkLinearBitmapPipeline::SampleProcessorInterface* next, 362 SkLinearBitmapPipeline::SampleProcessorInterface* next,
369 SkISize dimensions, 363 SkISize dimensions,
370 SkShader::TileMode xMode, 364 SkShader::TileMode xMode,
371 SkShader::TileMode yMode, 365 SkShader::TileMode yMode,
372 SkFilterQuality filterQuality, 366 SkFilterQuality filterQuality,
373 SkScalar dx, 367 SkLinearBitmapPipeline::TileStage* tileStage) {
374 SkLinearBitmapPipeline::TileStage* tileStage)
375 {
376 switch (xMode) { 368 switch (xMode) {
377 case SkShader::kClamp_TileMode: 369 case SkShader::kClamp_TileMode:
378 choose_tiler_ymode<XClampStrategy>(yMode, filterQuality, dimensions, next, tileStage); 370 choose_tiler_ymode<XClampStrategy>(yMode, filterQuality, dimensions, next, tileStage);
379 break; 371 break;
380 case SkShader::kRepeat_TileMode: 372 case SkShader::kRepeat_TileMode:
381 if (dx == 1.0f && filterQuality == kNone_SkFilterQuality) { 373 choose_tiler_ymode<XRepeatStrategy>(yMode, filterQuality, dimensions , next, tileStage);
382 choose_tiler_ymode<XRepeatUnitScaleStrategy>(
383 yMode, kNone_SkFilterQuality, dimensions, next, tileStage);
384 } else {
385 choose_tiler_ymode<XRepeatStrategy>(
386 yMode, filterQuality, dimensions, next, tileStage);
387 }
388 break; 374 break;
389 case SkShader::kMirror_TileMode: 375 case SkShader::kMirror_TileMode:
390 choose_tiler_ymode<XMirrorStrategy>(yMode, filterQuality, dimensions , next, tileStage); 376 choose_tiler_ymode<XMirrorStrategy>(yMode, filterQuality, dimensions , next, tileStage);
391 break; 377 break;
392 } 378 }
393 379
394 return tileStage->get(); 380 return tileStage->get();
395 } 381 }
396 382
397 383
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 if (inverse.getScaleX() >= 0.0f) { 581 if (inverse.getScaleX() >= 0.0f) {
596 adjustedInverse.setTranslateX( 582 adjustedInverse.setTranslateX(
597 nextafterf(inverse.getTranslateX(), std::floor(inverse.getTransl ateX()))); 583 nextafterf(inverse.getTranslateX(), std::floor(inverse.getTransl ateX())));
598 } 584 }
599 if (inverse.getScaleY() >= 0.0f) { 585 if (inverse.getScaleY() >= 0.0f) {
600 adjustedInverse.setTranslateY( 586 adjustedInverse.setTranslateY(
601 nextafterf(inverse.getTranslateY(), std::floor(inverse.getTransl ateY()))); 587 nextafterf(inverse.getTranslateY(), std::floor(inverse.getTransl ateY())));
602 } 588 }
603 } 589 }
604 590
605 SkScalar dx = adjustedInverse.getScaleX();
606
607 // If it is an index 8 color type, the sampler converts to unpremul for bett er fidelity. 591 // If it is an index 8 color type, the sampler converts to unpremul for bett er fidelity.
608 SkAlphaType alphaType = srcImageInfo.alphaType(); 592 SkAlphaType alphaType = srcImageInfo.alphaType();
609 if (srcPixmap.colorType() == kIndex_8_SkColorType) { 593 if (srcPixmap.colorType() == kIndex_8_SkColorType) {
610 alphaType = kUnpremul_SkAlphaType; 594 alphaType = kUnpremul_SkAlphaType;
611 } 595 }
612 596
613 // As the stages are built, the chooser function may skip a stage. For examp le, with the 597 // As the stages are built, the chooser function may skip a stage. For examp le, with the
614 // identity matrix, the matrix stage is skipped, and the tilerStage is the f irst stage. 598 // identity matrix, the matrix stage is skipped, and the tilerStage is the f irst stage.
615 auto placementStage = choose_pixel_placer(alphaType, postAlpha, &fPixelStage ); 599 auto placementStage = choose_pixel_placer(alphaType, postAlpha, &fPixelStage );
616 auto samplerStage = choose_pixel_sampler(placementStage, 600 auto samplerStage = choose_pixel_sampler(placementStage,
617 filterQuality, srcPixmap, &fSampl eStage); 601 filterQuality, srcPixmap, &fSampl eStage);
618 auto tilerStage = choose_tiler(samplerStage, 602 auto tilerStage = choose_tiler(samplerStage,
619 dimensions, xTile, yTile, filterQuality, dx, &fTiler); 603 dimensions, xTile, yTile, filterQuality, &fTiler);
620 fFirstStage = choose_matrix(tilerStage, adjustedInverse, &fMatrixSta ge); 604 fFirstStage = choose_matrix(tilerStage, adjustedInverse, &fMatrixSta ge);
621 } 605 }
622 606
623 void SkLinearBitmapPipeline::shadeSpan4f(int x, int y, SkPM4f* dst, int count) { 607 void SkLinearBitmapPipeline::shadeSpan4f(int x, int y, SkPM4f* dst, int count) {
624 SkASSERT(count > 0); 608 SkASSERT(count > 0);
625 fPixelStage->setDestination(dst); 609 fPixelStage->setDestination(dst);
626 // The count and length arguments start out in a precise relation in order t o keep the 610 // The count and length arguments start out in a precise relation in order t o keep the
627 // math correct through the different stages. Count is the number of pixel t o produce. 611 // math correct through the different stages. Count is the number of pixel t o produce.
628 // Since the code samples at pixel centers, length is the distance from the center of the 612 // Since the code samples at pixel centers, length is the distance from the center of the
629 // first pixel to the center of the last pixel. This implies that length is count-1. 613 // first pixel to the center of the last pixel. This implies that length is count-1.
630 fFirstStage->pointSpan(Span{{x + 0.5f, y + 0.5f}, count - 1.0f, count}); 614 fFirstStage->pointSpan(Span{{x + 0.5f, y + 0.5f}, count - 1.0f, count});
631 } 615 }
OLDNEW
« no previous file with comments | « no previous file | src/core/SkLinearBitmapPipeline_tile.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698